【发布时间】:2015-04-22 15:32:55
【问题描述】:
我有一个scala.collection.immutable.HashSet,我想从中随机选择一个元素。
我可以用这样的扩展方法解决这个问题:
implicit class HashSetExtensions[T](h: HashSet[T]) {
def nextRandomElement (): Option[T] = {
val list = h.toList
list match {
case null | Nil => None
case _ => Some (list (Random.nextInt (list.length)))
}
}
}
...但是转换为列表会很慢。什么是最有效的解决方案?
【问题讨论】:
-
你用的是
mutable.HashSet还是immutable.HashSet? -
我怀疑直接在 Set 上使用 Iterator,并在 0 和 set 大小之间随机推进它可能比转换为 List 更好,但我不知道是什么大小或迭代器的实现在 HashSet 上,所以我不确定。
-
实际上我用
Random.shuffle(h).headOption提出的解决方案是完全错误的,它总是返回相同的结果