我有一个对象,例如:
case class Person(name: String, number: Int)
Run Code Online (Sandbox Code Playgroud)
以及该对象的两个序列:
Seq(("abc", 1), ("def", 2))
Seq(("abc", 300), ("xyz", 400))
Run Code Online (Sandbox Code Playgroud)
我想将这两个序列合并到一个键为names且值此单独对象的单个Map中:
case class CombineObject(firstNumber: Option[Int], secondNumber: Option[Int])
Run Code Online (Sandbox Code Playgroud)
这样我的最终地图将如下所示:
Map(
  "abc" -> CombineObject(Some(1), Some(300)),
  "def" -> CombineObject(Some(2), None)),
  "xyz" -> CombineObject(None,    Some(400))
)
Run Code Online (Sandbox Code Playgroud)
我能想到的是在序列上运行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)))
Run Code Online (Sandbox Code Playgroud)
假定每个Seq都没有重复的name条目。目前尚不清楚应该如何处理这种情况。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           108 次  |  
        
|   最近记录:  |