2013-04-05 46 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)) 

搜索有关代码如何工作的更多信息,请参见“半群”。