2010-09-06 50 views
14

假设我有两个列表:查找,这不是在第二列表的列表元素(斯卡拉)

val a = List('a', 'b', 'c') 
val b = List('a', 'b', 'c', 'd') 

我想这是不是在第一个列表中的元素(在这种情况下,它的' d')。我知道我可以用循环做到这一点,但是有没有一种功能强大的方法可以在一行中快速执行此操作?我一直在寻找斯卡拉列表API,但只能找到联合和交集(这将给我列表('a','b','c','d')和列表('a ','b','c')分别)

回答

12

我认为你可以使用b -- a。这里是斯卡拉的文档:

def -- [B >: A] (that: List[B]) : List[B] 
Computes the difference between this list and the given list that. 
that 
the list of elements to remove from this list. 
returns this list without the elements of the given list that. 
deprecated: use list1 filterNot (list2 contains) instead 

很抱歉的方法已过时,这里是目前很好的一种:list1 filterNot (list2 contains)

def filterNot (p: (A) ⇒ Boolean) :

列表[A]选择此 列表中的所有元素不满足谓词。 p用于测试元素的谓词。 返回一个新列表,该列表包含此列表中所有 元素,其中 不满足给定的谓词p。元素的顺序被保留。 定义类:TraversableLike

+0

谢谢,那有效!除了2.8显然他们说它已被弃用,将被淘汰:OutputTree.scala:136:方法 - 在类List中已弃用:使用'list1 filterNot(list2 contains)'而不是 – 2010-09-06 08:36:11

+1

啊,你甚至复制并粘贴了弃用票据!我的错! =) – 2010-09-06 08:36:53

+0

别担心,我真的看不到弃用的行,只是复制整个:) – vodkhang 2010-09-06 08:38:53

18

您可以使用diff此:

scala> b diff a 
res1: List[Char] = List(d) 

你可能想,如果你正在做的diffSet工作。

0

当然,这可以通过很多方式完成。对于像数字和字符串列表的平坦结构diff是最优雅的。其他方法如下,

val ans1 = for { x <- b if !a.contains(x) } yield x 

val ans2 = for { x <- b if !a.exists(_ == x) } yield x 

val ans3 = b filterNot (x => b.contains(x)) 

val ans4 = b diff a