1

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

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

第一个列表中的地图 1List(Map("stringKey" -> "a0sd8fa0s8df", "name" -> "#hashtag", "updated" -> "88493048"))

第二个列表中的地图 2List(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") )
4

2 回答 2

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 
于 2013-04-13T00:40:42.963 回答
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, update -> 88773055, points -> 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 -> a0sd8fa0s8df, name -> #hashtag, point s -> 1000))

于 2013-04-13T02:00:41.963 回答