比较Scala中的两个List [CustomObject]

Ech*_*cho 1 scala

假设我有2个列表:

val list1:List[CustomObject] = List(obj1, obj2, obj3)
val list2:List[CustomObject] = List(obj4, obj5, obj6)
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ral 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
Run Code Online (Sandbox Code Playgroud)

现在,如果不可能,这可行:

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

效率极低.为了提高效率,请使用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
Run Code Online (Sandbox Code Playgroud)