我有两个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") )
答案 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))