假设我有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中是否可以做到这一点.
如果要对要用于比较的属性进行排序,则此方法有效:
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)