如何在Scala中查找List中的唯一项

时间:2009-10-08 15:37:39

标签: scala

Scala如何在List中查找唯一项?

8 个答案:

答案 0 :(得分:202)

在2.8中,它是:

List(1,2,3,2,1).distinct  // => List(1, 2, 3)

答案 1 :(得分:21)

最有效的保留顺序的方法是使用Set作为辅助数据结构:

def unique[A](ls: List[A]) = {
  def loop(set: Set[A], ls: List[A]): List[A] = ls match {
    case hd :: tail if set contains hd => loop(set, tail)
    case hd :: tail => hd :: loop(set + hd, tail)
    case Nil => Nil
  }

  loop(Set(), ls)
}

我们可以使用隐式转换以更好的语法包装它:

implicit def listToSyntax[A](ls: List[A]) = new {
  def unique = unique(ls)
}

List(1, 1, 2, 3, 4, 5, 4).unique    // => List(1, 2, 3, 4, 5)

答案 2 :(得分:12)

使用订单保留滚动您自己的uniq过滤器:

scala> val l = List(1,2,3,3,4,6,5,6)
l: List[Int] = List(1, 2, 3, 3, 4, 6, 5, 6)

scala> l.foldLeft(Nil: List[Int]) {(acc, next) => if (acc contains next) acc else next :: acc }.reverse
res0: List[Int] = List(1, 2, 3, 4, 6, 5)

答案 3 :(得分:10)

如果您参考Rosetta Code: Create a Sequence of unique elements

val list = List(1,2,3,4,2,3,4,99)
val l2 = list.removeDuplicates
// l2: scala.List[scala.Int] = List(1,2,3,4,99)

由于List是不可变的,因此您不会通过调用List来修改初始removeDuplicates

警告:如this tweet(!)所述,这不会保留顺序:

scala> val list = List(2,1,2,4,2,9,3)
list: List[Int] = List(2, 1, 2, 4, 2, 9, 3)

scala> val l2 = list.removeDuplicates
l2: List[Int] = List(1, 4, 2, 9, 3)

对于Seq,根据ticket 929,该方法应该在Scala2.8中可用。
与此同时,您需要将ad-hoc静态方法定义为one seen here

答案 4 :(得分:6)

Imho,对这个问题的所有解释都是错误的:

  

Scala如何在List中查找唯一项?

鉴于此清单:

val ili = List (1, 2, 3, 4, 4, 3, 1, 1, 4, 1) 

列表中唯一唯一的项目是2。其他项目不是唯一的。

ili.toSet.filter (i => ili.indexOf (i) == ili.lastIndexOf (i))

会找到它。

答案 5 :(得分:4)

list.filter { x => list.count(_ == x) == 1 }

答案 6 :(得分:2)

一个简单的ad-hoc方法就是将List添加到Set中,并从那里使用:

  val l = List(1,2,3,3,3,4,5,5,6,7,8,8,8,9,9)
  val s = Set() ++ x
  println(s)

产地:

> Set(5, 1, 6, 9, 2, 7, 3, 8, 4)

这适用于Seq(或任何Iterable),但在2.8中不是必需的,其中removeDuplicates方法可能更具可读性。此外,不确定运行时性能与经过深思熟虑的转换。

另外,请注意丢失的订单。

答案 7 :(得分:0)

list.toSet将执行此操作,因为按定义设置仅包含唯一元素