比较Scala中的两个List [CustomObject]

时间:2011-09-20 13:18:50

标签: scala

假设我有两个列表:

val list1:List[CustomObject] = List(obj1, obj2, obj3)
val list2:List[CustomObject] = List(obj4, obj5, obj6)

我想知道Scala中是否存在一种采用这两个列表的方法,并比较第一个列表中的obj.name是否出现在第二个列表中。

这可以使用2个内部循环和一个标志来完成。 但是,我想知道Scala中是否有某些东西可以做到这一点。

3 个答案:

答案 0 :(得分:8)

如果要对要用于比较的属性进行排序,则可以使用:

import scala.collection.immutable.SortedSet
val set1 = SortedSet(list1: _*)(Ordering by (_.name))
val set2 = SortedSet(list2: _*)(Ordering by (_.name))

val result = set1 &~ set2 union set2 &~ set1
val result2 = set1 | set2 diff set1 & set2 // also works

现在,如果无法做到这一点,那就可以了:

for {
  x <- list1 ++ list2 // you want elements from both, right?
  if list1.forall(_.name != x.name) || list2.forall(_.name != x.name)
} yield x

非常低效。为了提高效率,请使用Map

def carName = (x: Car) => x.name -> x
val map1 = (list1 map carName).toMap
val map2 = (list2 map carName).toMap
for {
  x <- list1 ++ list2 // you want elements from both, right?
  if map1(x).isEmpty || map2(x).isEmpty
} yield x

答案 1 :(得分:2)

与此类似的东西应该有效

list1.exists(a => list2.exists( b => a.name == b.name))

答案 2 :(得分:0)

以下对我很好:

 val comparisonResultList: List[Car] =
      for (l1 <- list1 if list2.filter(_.referenceName==l1.referenceName)==Nil)
      yield l1

感谢大家的支持。