2011-10-21 48 views
1

我:如何增加計數器到列表中的每個元素添加

scala> val alphaList = List("a", "b") 
alphaList: List[java.lang.String] = List(a, b) 

我想要像元組的列表:

List((a,1),(b,2)) 

通常在Java中我會做這樣的事情:

List alphaList = new ArrayList<String>() 
alphaList.add("a");alphaList.add("b"); 
List newList = new ArrayList<String>(); 
for (int i = 0; ii < alphaList.size(); i++) 
    newList.add(alphaList[i] + i); 

我想知道的是,我如何得到一個增量變量,我可以在處理列表時使用?

回答

7
alphaList.zipWithIndex.map { 
    case (k, v) => (k, v + 1) 
} 

zipWithIndex替換每個元件與本身和它的索引(從0開始)的元組。該map元組匹配,並創建加1的指數新的記錄,讓你從1開始,而不是0

1

......怎麼

def zipWithIndex1[A](xs:Seq[A]) = xs.map{var i = 0; x => i+=1; (x,i)} 

測試:

zipWithIndex1("sdlfkjsdlf") 
//--> Vector((s,1), (d,2), (l,3), (f,4), (k,5), (j,6), (s,7), (d,8), (l,9), (f,10)) 
+1

這取決於地圖的實現:它PR依次使用Seq元素。我不認爲有必要這樣做 –

+1

我認爲這應該確保序列......但是,非常有趣的解決方案......我不知道'x =>'後面的所有內容都變成了封閉,即使不添加大括號。 – axel22

+0

我不明白爲什麼它應該。 Scala集合的實現非常規律,只要map沒有被重新定義,它就會以這種方式工作,但是我認爲如果實現更高效,我認爲實現不會被執行。當然,它不適用於ParSeq,但我同意ParSeq不是Seq –

7

作爲替代Axel22的答案,這是很好的:

alphaList.zip(Stream.from(1)) 
+2

但是,如果'Iterator.from(1)'編譯好了會更好。 – Debilski

+0

的確,這是我首先嚐試做的,不明白爲什麼不應該在Iterator上可用。 –

+0

對不起,我的意思是'Iterable'。我認爲''from''應該在'Iterable'上面,這是我正在尋找的。我不喜歡直接使用'Iterator'。 –

相關問題