【问题标题】:Find elements in a list that are not in the second list (in scala)在列表中查找不在第二个列表中的元素(在 scala 中)
【发布时间】:2011-04-08 16:12:38
【问题描述】:

假设我有两个列表:

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

我想获取不在第一个列表中的元素(在本例中为“d”)。我知道我可以通过循环来做到这一点,但是有没有什么花哨的功能方法可以在一行中快速做到这一点?

我一直在查看 Scala List API,但只能找到联合和交集(这将给我 List('a', 'b', 'c', 'd') 和 List('a' , 'b', 'c') 分别)

【问题讨论】:

    标签: list scala functional-programming


    【解决方案1】:

    您可以为此使用diff

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

    如果您正在使用diff,您可能希望使用Set

    【讨论】:

      【解决方案2】:

      我认为你可以使用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) :

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

      【讨论】:

      • 谢谢,这行得通!除了在 2.8 中,显然他们说它已被弃用并将逐步淘汰:OutputTree.scala:136: method -- in class List is deprecated: use list1 filterNot (list2 contains) instead
      • 啊,你甚至复制并粘贴了弃用说明!我的错! =)
      • 别担心,我并没有真正看到弃用的行,只是复制整个:)
      【解决方案3】:

      当然,这可以通过多种方式完成。对于像数字和字符串列表这样的扁平结构,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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-26
        相关资源
        最近更新 更多