我有一个对象,例如:

case class Person(name: String, number: Int)

以及该对象的两个序列:
Seq(("abc", 1), ("def", 2))
Seq(("abc", 300), ("xyz", 400))

我想将这两个序列合并到一个键为name的Map中,并对该单独的对象进行赋值:
case class CombineObject(firstNumber: Option[Int], secondNumber: Option[Int])

这样我的最终 map 将如下所示:
Map(
  "abc" -> CombineObject(Some(1), Some(300)),
  "def" -> CombineObject(Some(2), None)),
  "xyz" -> CombineObject(None,    Some(400))
)

我能想到的是在序列上运行2 for循环以创建映射。有没有更好的方法来解决问题?

最佳答案

将每个 Seq 变成它自己的 Map 。之后就很容易了。

case class Person( name : String
                 , number : Int )

val s1 = Seq(Person("abc",1),Person("def",2))
val s2 = Seq(Person("abc",300),Person("xyz",400))

val m1 = s1.foldLeft(Map.empty[String,Int]){case (m,p) => m+(p.name->p.number)}
val m2 = s2.foldLeft(Map.empty[String,Int]){case (m,p) => m+(p.name->p.number)}

case class CombineObject( firstNumber  : Option[Int]
                        , secondNumber : Option[Int] )

val res = (m1.keySet ++ m2.keySet).foldLeft(Map.empty[String,CombineObject]){
  case (m,k) => m+(k -> CombineObject(m1.get(k),m2.get(k)))
}
//res: Map[String,CombineObject] = Map(abc -> CombineObject(Some(1),Some(300))
//                                   , def -> CombineObject(Some(2),None)
//                                   , xyz -> CombineObject(None,Some(400)))

这假设每个 Seq 没有重复的 name 条目。这种情况应该如何处理并不明显。

关于scala - 合并两个 Seq 以创建 Map,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56548055/

10-11 22:42
查看更多