2014-11-02 47 views
0

我有以下類型的嵌套地圖數據結構:轉換的SortedMap數據類型

SortedMap[Time: Long,SortedMap[Name: String, Value: Double]] 

「時間」元素是Long類型和指示數據的時間戳。 「名稱」元素的類型爲String,並指示元素的名稱。 「值」元素的類型爲Double,並指示時間戳「時間」的元素值。

其基本思想是對於每個時間戳,我們有幾個元素,每個元素都有一個當前時間戳的特定值。

我想要的結果是每個「名稱」元素的Array[Double]List[Double]。我不需要「時間」值,除非我想以相同的方式排序結果。

例子:

val dataType = SortedMap(1000L -> SortedMap("component1" -> 1.0, 
    "component2" -> 1.1), 2000L -> SortedMap("component1" -> 1.1), 
    3000L -> SortedMap("component1" -> 0.95)) 

我想要的結果如下:

"component1" - 1.0, 1.1, 0.95 
"component2" - 1.1 

任何人都可以請幫助?

+0

你能更清楚地解釋你的問題嗎?什麼數據'SortedMap'存儲?什麼是'時間'? – 2014-11-02 07:15:26

+0

你可以給一個簡短的scala片斷,問題不清楚。 – mavarazy 2014-11-02 07:27:08

回答

0

我認爲你想要的結果類型是Map[String, Seq[Double]。我將使用Vector作爲排序值,因爲它有一個有效的附加方法:+

首先,您要刪除外部地圖的時間鍵。您可以使用valuesvaluesIterator。那麼最簡單的方法就是對這些值執行「摺疊」操作,從空的結果圖開始,並在每一步更新它。您需要兩個嵌套摺疊,因爲您首先在地圖上再遍歷每個地圖的各個元素。

import scala.collection.immutable.SortedMap 
val dataType = SortedMap(
    1000L -> SortedMap("component1" -> 1.0, "component2" -> 1.1), 
    2000L -> SortedMap("component1" -> 1.1), 
    3000L -> SortedMap("component1" -> 0.95) 
) 

(Map.empty[String, Vector[Double]] /: dataType.values) { case (res0, map) => 
    (res0 /: map) { case (res1, (key, value)) => 
    res1.updated(key, res1.getOrElse(key, Vector.empty) :+ value) 
    } 
} 

// Map(component1 -> Vector(1.0, 1.1, 0.95), component2 -> Vector(1.1)) 

請注意摺疊左邊的電話(init /: coll) …。您可以使用另一種方法coll.foldLeft(init) …這將產生稍微不同的語法:

dataType.values.foldLeft(Map.empty[String, Vector[Double]]) { case (res0, map) … 

您可以在結果交換MapSortedMap,如果你想組件名稱來保持排序狀態。

+0

非常感謝,這很好。 – user3370773 2014-11-02 15:48:05