在Sele of Tuples中查找不常见的元素

时间:2014-05-23 13:52:09

标签: scala tuples

我试图返回每个用户不常见的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

交叉方法可以在这里使用还是有替代方法?

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的,使用diffintersect可能无法帮助您解决问题。可能有一些更好的内置,但如果没有,那么你可以使用类似于此的逻辑(这是长形式,以便不同的步骤是明确的):

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)