我试图返回每个用户不常见的Seq元素:
val l1 = ("" , Seq( ("a" , 1) , ("b" , 2) , ("c" , 3) ) )
//> l1 : (String, Seq[(String, Int)]) = ("",List((a,1), (b,2), (c,3)))
val l2 = ("" , Seq( ("a" , 4) , ("d" , 5) , ("c" , 6) ) )
//> l2 : (String, Seq[(String, Int)]) = ("",List((a,4), (d,5), (c,6)))
val t1 = l1._2 //> t1 : Seq[(String, Int)] = List((a,1), (b,2), (c,3))
val t2 = l2._2 //> t2 : Seq[(String, Int)] = List((a,4), (d,5), (c,6))
将元素相交似乎是一个显而易见的方法,但返回一个空List:
t1.intersect(t2) //> res0: Seq[(String, Int)] = List()
应返回( ("b" , 2) , ("d" , 5) )
,因为这些元组在l1&中并不常见。 L2
交叉方法可以在这里使用还是有替代方法?
答案 0 :(得分:2)
正如我在评论中提到的,使用diff
或intersect
可能无法帮助您解决问题。可能有一些更好的内置,但如果没有,那么你可以使用类似于此的逻辑(这是长形式,以便不同的步骤是明确的):
val l1 = Seq( ("a" , 1) , ("b" , 2) , ("c" , 3) )
val l2 = Seq( ("a" , 4) , ("d" , 5) , ("c" , 6) )
val m1 = l1.toMap
val m2 = l2.toMap
val differentKeys = m1.keySet.diff(m2.keySet) ++ m2.keySet.diff(m1.keySet)
val result = (l1 ++ l2).filter{
case (k, v) => differentKeys.contains(k)
}
println(result)