每次使用没有重复的序列时,使用Set而不是Seq是一个好习惯吗?

时间:2015-03-03 21:08:16

标签: scala scala-collections

我几天前发现了Set我知道每次我需要sequence没有duplicates时使用它,即使我确定赢了&# 39;是任何。因此,我经常需要在代码中使用toSet方法。

因此,我现在想知道,每次我需要Set而没有Seq时,使用sequence代替duplicates是否是一个好习惯?

2 个答案:

答案 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