2013-04-05 137 views
1

我有以下數據結構:Scala中結合的地圖列表

List(Map(
    1365094146000000 -> Map(latitude -> 45.30397), 
    1365094752000000 -> Map(latitude -> 45.30405), 
    1365094449000000 -> Map(latitude -> 45.30412), 
    1365095351000000 -> Map(latitude -> 45.30400), 
    1365095054000000 -> Map(latitude -> 45.30400)), 
    Map(
    1365094146000000 -> Map(longitude -> -75.89806), 
    1365094752000000 -> Map(longitude -> -75.89806), 
    1365094449000000 -> Map(longitude -> -75.89811), 
    1365095351000000 -> Map(longitude -> -75.89804), 
    1365095054000000 -> Map(longitude -> -75.89809))) 

請告訴我合併這些地圖,這樣得到的對象將是以下的最佳方式:

Map(1365094146000000 -> Map(latitude -> 45.30397, longitude -> -75.89806), 
    1365094752000000 -> Map(latitude -> 45.30405, longitude -> -75.89806)) 

感謝

回答

3

至於輸入結構,latitudelongtitude應該是字符串。另外,時間戳應該是Longs,因爲它們不在Int的範圍內。例如,

val lst = List(Map(
    1365094146000000l -> Map("latitude" -> 45.30397), 
    1365094752000000l -> Map("latitude" -> 45.30405), 
    1365094449000000l -> Map("latitude" -> 45.30412), 
    1365095351000000l -> Map("latitude" -> 45.30400), 
    1365095054000000l -> Map("latitude" -> 45.30400)), 
    Map(
    1365094146000000l -> Map("longitude" -> -75.89806), 
    1365094752000000l -> Map("longitude" -> -75.89806), 
    1365094449000000l -> Map("longitude" -> -75.89811), 
    1365095351000000l -> Map("longitude" -> -75.89804), 
    1365095054000000l -> Map("longitude" -> -75.89809))) 

一旦這樣固定的,你可以這樣做:

yourList.flatten.groupBy(_._1) map { case (key, value) => key -> value.map(_._2).flatten.toMap } toMap 

首先,這一起合併兩個地圖。然後,它通過時間戳將條目分組以形成Map[Long,List[(Long, Map[String,Double])]]。之後,我們即將解決問題,只需要清除值(value.map(_._2))中的時間戳重複數據,將緯度和經度平坦化並將它們轉換爲Map。最後,我們將List的輸出轉換爲Map

擴展版本類型如下:

yourList.flatten.groupBy { x: (Long, Map[String, Double]) => 
    x._1 } map { case (key: Long, value: List[(Long, Map[String, Double])]) => 
     key -> value.map { x: (Long, Map[String, Double]) => 
      x._2 
     }.flatten.toMap 
    } toMap 
+0

非常感謝! – chiappone 2013-04-05 21:39:14

+0

另外一個問題,將結果圖排序的最佳方法是什麼,以便時間戳按從大到小的順序排列 – chiappone 2013-04-05 21:57:53

+0

根據以前表達式的結果,執行'TreeMap(previousResult.toArray:_ *)'其中'TreeMap '是scala.collection.immutable.TreeMap' – 2013-04-05 22:03:55

2

另一種可能性:

val latitude = "latitude" 
val longitude = "longitude" 

val data : List[Map[Long, Map[String, Double]]] = List(Map(
    1365094146000000L -> Map(latitude -> 45.30397), 
    1365094752000000L -> Map(latitude -> 45.30405), 
    1365094449000000L -> Map(latitude -> 45.30412), 
    1365095351000000L -> Map(latitude -> 45.30400), 
    1365095054000000L -> Map(latitude -> 45.30400)), 
    Map(
    1365094146000000L -> Map(longitude -> -75.89806), 
    1365094752000000L -> Map(longitude -> -75.89806), 
    1365094449000000L -> Map(longitude -> -75.89811), 
    1365095351000000L -> Map(longitude -> -75.89804), 
    1365095054000000L -> Map(longitude -> -75.89809))) 

data match { 
    case List(latmap, longmap) => 
    for ((key, vlat) <- latmap; vlong <- longmap.get(key)) yield (key, vlong ++ vlat) 
} 
0

Scalaz提供了一個很好的方式做你想要什麼:

import scalaz._, Scalaz._ 

val lst = List(Map(
    1365094146000000l -> Map("latitude" -> 45.30397), 
    1365094752000000l -> Map("latitude" -> 45.30405), 
    1365094449000000l -> Map("latitude" -> 45.30412), 
    1365095351000000l -> Map("latitude" -> 45.30400), 
    1365095054000000l -> Map("latitude" -> 45.30400)), 
    Map(
    1365094146000000l -> Map("longitude" -> -75.89806), 
    1365094752000000l -> Map("longitude" -> -75.89806), 
    1365094449000000l -> Map("longitude" -> -75.89811), 
    1365095351000000l -> Map("longitude" -> -75.89804), 
    1365095054000000l -> Map("longitude" -> -75.89809))) 

scala> lst(0) |+| lst(1) foreach println 
(1365094146000000,Map(longitude -> -75.89806, latitude -> 45.30397)) 
(1365094752000000,Map(longitude -> -75.89806, latitude -> 45.30405)) 
(1365094449000000,Map(longitude -> -75.89811, latitude -> 45.30412)) 
(1365095351000000,Map(longitude -> -75.89804, latitude -> 45.304)) 
(1365095054000000,Map(longitude -> -75.89809, latitude -> 45.304)) 

搜索有關代碼如何工作的更多信息,請參見「半羣」。