Scala:如何将ArrayBuffer转换为Set?

5

我一直在寻找如何将 ArrayBuffer 转换为 Set,更准确地说是转换为 HashSet。有什么提示吗?


2
在scaladoc中,搜索是您的好帮手。如果您在方法列表中键入“set”,则会获得一个包含13个方法的列表,而要找到toSet则会更容易些。 - Daniel C. Sobral
3个回答

11

ArrayBuffer 中已经实现了一个 toSet 函数。

示例:

scala> import collection.mutable.ArrayBuffer
import collection.mutable.ArrayBuffer

scala> import collection.immutable.HashSet
import collection.immutable.HashSet

scala> val a = new ArrayBuffer(2)
a: scala.collection.mutable.ArrayBuffer[Nothing] = ArrayBuffer()

scala> val b = a.toSet
b: scala.collection.immutable.Set[Nothing] = Set()

1
太疯狂了,我看了scaladoc但是错过了它,而且eclipse也不想自动完成我的最后一个数组,以便能够弄清如何转换它。非常感谢。 - space borg

3

设置:

scala> val bf = ArrayBuffer(1,2,3,4)
bf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)
scala> bf.toSet
res0: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)

To HashSet:

scala> val hs = new HashSet[Int]++ bf.toSet
hs: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3, 4)

1
第二个例子是多余的。它们几乎做了相同的事情,唯一的区别是 toSet 会使用专门的类来处理少于5个元素的 Set,而不是使用 HashSetArrayBuffer(1,2,3,4).toSet.isInstanceOf[HashSet[_]] == falseArrayBuffer(1,2,3,4,5).toSet.isInstanceOf[HashSet[_]] == true - soc
@soc 感谢您的评论 - 我不知道少于5个元素的特殊情况。 - om-nom-nom

3

为了完整起见,再介绍一种方式:

scala> import collection.mutable.ArrayBuffer
import collection.mutable.ArrayBuffer

scala> val as = ArrayBuffer(34, 89, 11)
as: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(34, 89, 11)

scala> Set(as: _*)
res13: scala.collection.immutable.Set[Int] = Set(34, 89, 11)

我尝试了这个Set(array: _*),但出于某些原因它没有起作用。很高兴看到它应该可以 :) - space borg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接