Scala将单独的List [Map [String,Any]]组合成一个列表和concat Maps

时间:2013-04-12 23:41:15

标签: scala scalaz

我有两个List[Map[String,String]]列表,其中第二个地图列表有一个键“stringKey”,它匹配第一个地图列表中的单个“stringKey”。我需要将两个列表合并为一个,并将第二个Map的值附加到第一个。

Catch是第二个地图列表可能有重复的键作为第一个列表,但可以丢弃这些键。我正在考虑使用scalaz子组,但在丢弃重复项时丢失了。以下是两种类型地图的示例:

第一个列表中的

地图1 List(Map("stringKey" -> "a0sd8fa0s8df", "name" -> "#hashtag", "updated" -> "88493048"))

第二个列表中的

地图2 List(Map("stringKey" -> "a0sd8fa0s8df", "points" -> "1000", "updated" -> "88773055"))

结果为List(Map("stringKey" -> "a0sd8fa0s8df", "name" -> "#hashtag", "points" -> "1000"))

我猜这两个名单的合并将是一个开始。有什么想法吗?谢谢!

更新

到目前为止我已经得到了这个,但它给了我一个List[Option[String],List[Map[String,String]]]

l1 ++ l2 groupBy ( _.get("stringKey") )

2 个答案:

答案 0 :(得分:2)

听起来列表中的每个地图都代表一个唯一的对象。我会将第一个地图列表转换为地图地图,其中键是“stringKey”的值(听起来像是我的唯一ID)。

至少有一个这样的Map你可以简单地浏览另一个列表,通过stringKey快速查找列表中的子映射并更新它们。

如果您需要 - 您可以将地图地图转换回地图列表。

对于List2上的foldLeft来说,所有这些BTW听起来都很棒

更新:这是我到目前为止所提出的......似乎做你需要的。

val lst1 = List(Map("stringKey" -> "a0sd8fa0s8df", "name" -> "#hashtag", "updated" -> "88493048"))
val lst2 = List(Map("stringKey" -> "a0sd8fa0s8df", "points" -> "1000", "updated" -> "88773055"))

val result = lst2.foldLeft( lst1.map( x => (x("stringKey") -> x ) ).toMap) { (m,v) =>
    val id = v("stringKey")
    m + ( id -> ( m.getOrElse( id, Map()) ++ v) )
 }.values.toList 

答案 1 :(得分:1)

val listA = List(Map("stringKey" -> "a0sd8fa0s8df", "name" -> "#hashtag", "updated" -> "88493048"))
val listB = List(Map("stringKey" -> "a0sd8fa0s8df", "points" -> "1000", "updated" -> "88773055"))

List((listA ++ listB).flatMap(a=>a).toMap)

Res7:List [scala.collection.immutable.Map [String,String]] = List(Map(stringKey - > a0sd8fa0s8df,name - > #hashtag,updat ed - > 88773055,分 - > 1000))

如果您只想要唯一的键,值对:

val a = (listA ++ listB).flatMap(a=>a)
List(a.filter( s => a.distinct.count( t => t._1 == s._1 ) <= 1 ).distinct.toMap)

res20:List [scala.collection.immutable.Map [String,String]] = List(Map(stringKey - &gt; a0sd8fa0s8df,name - &gt; #hashtag,point s - &gt; 1000))