我几天前发现了Set
我知道每次我需要sequence
没有duplicates
时使用它,即使我确定赢了&# 39;是任何。因此,我经常需要在代码中使用toSet
方法。
因此,我现在想知道,每次我需要Set
而没有Seq
时,使用sequence
代替duplicates
是否是一个好习惯?
答案 0 :(得分:5)
集合还有一个重要的属性,它们没有已定义的顺序。如果你的收藏适合这个,那么使用Set
是一个好主意。 (所以,如果你到处都是toSet
,那么这可能是一个好主意。)
如果订单是由Set
中值的某些属性定义的,那么您可以使用SortedSet
。
另一方面,如果它是具有定义顺序的值序列,而不是基于值的某些属性,但您想要唯一值,则Set
不适合。您可以使用Seq.distinct
仍然拥有Seq
但不重复。
答案 1 :(得分:5)
如果您确定没有重复项,那么您应该使用Seq
Vector
。原因是Set
有额外的开销:它必须散列每个元素并可能检查与其他元素的相等性。根据您拥有的元素数量以及它们的复杂程度,这可能是您想要避免的。
示范:
class A(val name: Int) {
override def hashCode() = {
println(f"hashing $name")
name.hashCode
}
override def equals(other: Any) = other match {
case a: A =>
println(f"$name =?= ${a.name}")
name == a.name
case _ => false
}
}
val elements = (0 to 10).map(new A(_))
println("TO VECTOR")
val seq = Vector.empty ++ elements
println("TO SET")
val set = Set.empty ++ elements
打印:
TO VECTOR // Notice no extra work was done
TO SET // Lots of extra stuff done:
1 =?= 0
2 =?= 0
2 =?= 1
3 =?= 0
3 =?= 1
3 =?= 2
4 =?= 0
4 =?= 1
4 =?= 2
4 =?= 3
hashing 0
hashing 1
hashing 2
hashing 3
hashing 4
hashing 5
hashing 6
hashing 7
hashing 8
hashing 9
hashing 10