从一个列表中提取不在另一个列表中的元素

时间:2012-03-04 22:26:34

标签: scala

简单地说,我有两个列表,我需要提取添加到其中一个的新元素。 我有以下

val x = List(1,2,3)
val y = List(1,2,4)

val existing :List[Int]= x.map(xInstance => {
      if (!y.exists(yInstance =>
        yInstance == xInstance))
        xInstance
    })

Result :existing: List[AnyVal] = List((), (), 3)

我需要删除除最低费用的数字以外的所有其他元素。

4 个答案:

答案 0 :(得分:17)

选择合适的数据结构,生活变得更加轻松。

scala> x.toSet -- y
res1: scala.collection.immutable.Set[Int] = Set(3)

还要注意:

if (condition) expr1

简写:

if (condition) expr1 else ()

使用通常具有静态类型AnyAnyVal的结果几乎总是错误的。它只适用于副作用:

if (condition) buffer += 1
if (condition) sys.error("boom!")

答案 1 :(得分:14)

retronym的解决方案没问题,如果您没有重复的元素而且您不关心订单。但是你没有表明是这样的。

因此,将y转换为集合(不是x)可能最有效。我们只需要遍历列表一次,并且将对该集合进行快速O(log(n))访问。

你需要的只是

x filterNot y.toSet
// res1: List[Int] = List(3)

编辑:

另外,还有一种更简单的内置方法:

x diff y

(我看了一下实现;它看起来非常有效,使用HashMap计算出现次数。)

答案 2 :(得分:5)

简单的方法是使用filter代替,这样就无需删除;

val existing :List[Int] = 
  x.filter(xInstance => !y.exists(yInstance => yInstance == xInstance))

答案 3 :(得分:2)

val existing = x.filter(d => !y.exists(_ == d))

返回

existing: List[Int] = List(3)