如何在Scala中findList中的唯一项目

Scala如何在List中find独特的项目?

这样做的最有效的顺序保存方法是使用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.8中,它是:

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

订单保留滚动您自己的uniqfilter:

 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) 

如果您参考Rosetta代码:创build唯一元素的序列

 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是不可变的,所以你不会通过调用removeDuplicates修改初始List

警告:正如这个鸣叫 (!)所提到的,这不会保留这个命令:

 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 ,根据票929 ,该方法应该在Scala2.8中可用。
同时,您将需要定义一个特殊的静态方法,就像这里看到的一样

伊姆,这个问题的所有解释都是错误的:

Scala如何在List中find独特的项目?

鉴于这个名单:

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

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

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

会find它。

一个简单的专门方法就是将列表添加到一个集合,并从那里使用:

  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方法可能更具可读性。 另外,不确定运行时性能与更深思熟虑的转换。

另外,请注意丢失的顺序。

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

list.toSet将做到这一点,因为按定义设置只包含独特的元素