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

Vol*_*lyy 76 scala

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

小智 204

在2.8中,它是:

List(1,2,3,2,1).distinct  // => List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

  • 如果这是你想要的(通常不是),请使用:List(1,2,3,2,1).groupBy(x => x).filter(_._ 2.lengthCompare(1)== 0).中的keySet (18认同)

Dan*_*wak 22

最有效的保存顺序的方法是使用a 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)
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用隐式转换将其包装在一些更好的语法中:

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)
Run Code Online (Sandbox Code Playgroud)

  • 它过于复杂*现在*.Scala 2.7没有更好的东西. (14认同)

Syn*_*sso 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)
Run Code Online (Sandbox Code Playgroud)

  • 我非常喜欢这个,因为它允许复杂的过滤逻辑.谢谢! (4认同)

Von*_*onC 10

如果您参考Rosetta代码:创建一系列独特元素

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)
Run Code Online (Sandbox Code Playgroud)

既然List是不可变的,你不会List通过调用修改初始值removeDuplicates

警告:正如本推文(!)所述,这不保留顺序:

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)
Run Code Online (Sandbox Code Playgroud)

对于a Seq,根据故障单929,该方法应该在Scala2.8中可用.
与此同时,您需要定义一个ad-hoc静态方法,如此处 所示


use*_*own 6

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

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

鉴于此列表:

val ili = List (1, 2, 3, 4, 4, 3, 1, 1, 4, 1) 
Run Code Online (Sandbox Code Playgroud)

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

ili.toSet.filter (i => ili.indexOf (i) == ili.lastIndexOf (i))
Run Code Online (Sandbox Code Playgroud)

会找到它.

  • 大多数java/scala开发人员会将"给定列表中的唯一项目"的问题翻译为"具有给定列表的所有不同值"而不是"所有值在给定列表中单独出现"...这就是您之前的每个答案的方式解释它,以及提出问题的人(谁批准了这样的答案).2年多后会发生什么,并且在解析已经回答的问题时更加敏感? (4认同)

小智 5

list.filter { x => list.count(_ == x) == 1 }
Run Code Online (Sandbox Code Playgroud)