假设我有两个列表:
val list1:List[CustomObject] = List(obj1, obj2, obj3)
val list2:List[CustomObject] = List(obj4, obj5, obj6)
我想知道Scala中是否存在一种采用这两个列表的方法,并比较第一个列表中的obj.name
是否出现在第二个列表中。
这可以使用2个内部循环和一个标志来完成。 但是,我想知道Scala中是否有某些东西可以做到这一点。
答案 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
感谢大家的支持。