相关疑难解决方法(0)

如何在列表中查找重复项?

我有一个未排序的整数列表,我想找到那些有重复的元素.

val dup = List(1,1,1,2,3,4,5,5,6,100,101,101,102)
Run Code Online (Sandbox Code Playgroud)

我可以使用dup.distinct找到集合的不同元素,所以我写了如下答案.

val dup = List(1,1,1,2,3,4,5,5,6,100,101,101,102)
val distinct = dup.distinct
val elementsWithCounts = distinct.map( (a:Int) => (a, dup.count( (b:Int) => a == b )) )
val duplicatesRemoved = elementsWithCounts.filter( (pair: Pair[Int,Int]) => { pair._2 <= 1 } )
val withDuplicates = elementsWithCounts.filter( (pair: Pair[Int,Int]) => { pair._2 > 1 } )
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来解决这个问题?

scala list scala-collections

29
推荐指数
3
解决办法
2万
查看次数

功能编程:列表是否仅包含唯一项?

我有一个未排序的列表,想要知道它中的所有项目是否都是唯一的.
我天真的做法是

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

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

编辑: 我的基准3个最流行的解决方案,l==l.distinct,l.size==l.distinct.size和阿列克谢的基于HashSet的解决方案.每个函数运行1000次,包含10个项目的唯一列表,10000个项目的唯一列表以及第三个季度中出现的一个项目复制到列表中间的相同列表.在每次运行之前,每个函数都被调用1000次来预热JIT,整个基准测试在使用System.currentTimeMillis之前运行了5次.这台机器是C2D P8400(2.26 GHz),内存为3GB,java版本是OpenJDK 64位服务器VM(1.6.0.20).java args是-Xmx1536M -Xms512M

结果:

l.size==l.distinct.size (3, 5471, 2, 6492)
l==l.distinct           (3, 5601, 2, 6054)
Alexey's 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's HashSet        MutableList(2, 2341, 3, 784)

使用HashSets的解决方案肯定是最快的,正如他已经指出的使用.size并没有产生重大影响.

language-agnostic functional-programming scala

10
推荐指数
2
解决办法
1401
查看次数

不寻常地使用新关键字

感谢这个帖子,我从Akos Krivach的评论中听到了这个链接.

解决方案中的代码如下:

implicit def enhanceWithContainsDuplicates[T](s:List[T]) = new {
  def containsDuplicates = (s.distinct.size != s.size)
}

assert(List(1,2,2,3).containsDuplicates)
assert(!List("a","b","c").containsDuplicates)
Run Code Online (Sandbox Code Playgroud)

我从未见过new在此上下文中使用过该关键字.

任何人都可以告诉我它是如何工作的?这个模式有名字吗?

干杯

scala

3
推荐指数
1
解决办法
104
查看次数