2013-02-23 117 views
0

我有一個IndexedSeq[Map[String, String]],我想提取的價值,其中關鍵是「文本」,我想把它放在val text:IndexedSeq[String]。我寫了下面的一塊,但它不工作:斯卡拉訪問地圖序列

val text:IndexedSeq[String] = _ 
for(j <- 0 to indSeq.length-1){ 
    text(j) = indSeq(j).get("text") 
} 

回答

1

你可能會看到一個編譯器錯誤,因爲indSeq(j).get("text")返回Option[String],而不是String

如果你只是想獲得一個序列的關鍵"text"所有的值,使用:

val text = indSeq flatMap (_ get "text") 

如果這兩個序列的指數排隊,那麼你將要替換默認這一點很重要在鍵"text"值不存在:

val text = indSeq map (_.getOrElse("text", "default")) 
+0

我得到整個地圖扁平化,而不僅僅是具有關鍵「文本」的值。所以我在尋找「文字」 - >「Lorem ipsum」,我想要一個「Lorem ipsum」序列。我相信每張地圖都有一個關鍵的「文字」 – 2013-02-23 19:39:55

0

既然你試圖用一個換理解最初,你可能也有興趣在做這種方式:

val text = (for { m <- indSeq } yield m get "text") flatten 

編輯

,或者如果你想有一個默認值,你可以這樣做:

val text = for { m <- indSeq } yield m getOrElse("text", "default") 
+0

這將擺脫原來的索引,我明白他有興趣保留 – Chirlo 2013-02-23 17:58:32

0

我認爲最好的辦法是用一個換理解與後衛擺脫了地圖,唐「T有"text"元素:

val result = for { 
    i <- 0 until indexSeq.length 
    map = indexSeq(i) 
    if map isDefinedAt ("text") 
} yield { (i, map("text")) } 

val seq = result.toIndexedSeq 

這樣,你保留原始指標與地圖。它也避免保留任何var值,這總是一個振作