代码之家  ›  专栏  ›  技术社区  ›  Enrico Susatyo

在不在第二个列表中的列表中查找元素(scala中)

  •  19
  • Enrico Susatyo  · 技术社区  · 15 年前

    假设我有两个列表:

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

    我想得到不在第一个列表中的元素(在本例中是“d”)。我知道我可以用一个循环来完成这项工作,但是有没有什么奇特的功能性方法可以在一行中快速完成这项工作?

    我一直在查看scala列表API,但只能找到union和intersection(这将分别给我列表(“a”、“b”、“c”、“d”)和列表(“a”、“b”、“c”)。

    3 回复  |  直到 9 年前
        1
  •  13
  •   vodkhang    15 年前

    我想你可以用 b -- a . 以下是scala提供的文档:

    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。 元素的顺序保持不变。 定义类:可遍历类

        2
  •  20
  •   olle kullberg    15 年前

    你可以使用 diff 为此:

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

    你可能想和 Set 如果你在做 微分 .

        3
  •  0
  •   Abel Terefe    9 年前

    当然,这可以通过多种方式实现。用于数字和字符串列表之类的平面结构 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
    
    推荐文章