我有一个未排序的列表,想知道列表中的所有项目是否都是唯一的。
我的幼稚方法是

val l = List(1,2,3,4,3)
def isUniqueList(l: List[Int]) = (new HashSet()++l).size == l.size

基本上,我正在检查包含列表中所有元素的Set的大小是否相同(因为在原始列表中出现两次的项目只会在set中出现一次),但是我不确定这是否是理想的解决方案对于这个问题。

编辑:
我对3种最受欢迎​​的解决方案(l==l.distinctl.size==l.distinct.size和Alexey基于HashSet的解决方案)进行了基准测试。
每个功能运行了1000次,其中包含10个项目的唯一列表,10000个项目的唯一列表以及在第三季度出现一个项目的相同列表被复制到列表的中间。在每次运行之前,调用每个函数1000次以预热JIT,整个基准测试运行5次,然后再使用System.currentTimeMillis进行计算。
该机器是具有3GB RAM的C2D P8400(2.26 GHz),Java版本是OpenJDK 64位服务器VM(1.6.0.20)。 Java参数为-Xmx1536M -Xms512M

结果:

l.size == l.distinct.size(3,5471,2,2492)
l == l.distinct(3,5601,2,6054)
Alexey的HashSet(2,1590,3,781)

具有较大对象(字符串从1KB到5KB)的结果:

l.size == l.distinct.size MutableList(4,5566,7,6506)
l == l.distinct MutableList(4,5926,3,6075)
Alexey的HashSet MutableList(2,2341,3,784)

使用HashSets的解决方案绝对是最快的,而且正如他已经指出的那样,使用.size并没有太大的区别。

最佳答案

这是我能想到的最快的纯功能解决方案:

def isUniqueList(l: List[T]) = isUniqueList1(l, new HashSet[T])

@tailrec
def isUniqueList1(l: List[T], s: Set[T]) = l match {
  case Nil => true
  case (h :: t) => if (s(h)) false else isUniqueList1(t, s + h)
}

这应该更快,但是使用可变的数据结构(基于Vasil Remeniuk给出的distinct实现):
def isUniqueList(l: List[T]): Boolean = {
  val seen = mutable.HashSet[A]()
  for (x <- this) {
    if (seen(x)) {
      return false
    }
    else {
      seen += x
    }
  }
  true
}

这是最简单的(相当于您的):
def isUniqueList(l: List[T]) = l.toSet.size == l.size

10-04 22:25