我有一个对象,例如:
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/