简单地说,我有两个列表,我需要提取添加到其中一个的新元素。 我有以下
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)
我需要删除除最低费用的数字以外的所有其他元素。
答案 0 :(得分:17)
选择合适的数据结构,生活变得更加轻松。
scala> x.toSet -- y
res1: scala.collection.immutable.Set[Int] = Set(3)
还要注意:
if (condition) expr1
简写:
if (condition) expr1 else ()
使用通常具有静态类型Any
或AnyVal
的结果几乎总是错误的。它只适用于副作用:
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)