【问题标题】:Is there a specific order of insertion of an element to a set?将元素插入集合是否有特定的顺序?
【发布时间】:2019-12-02 23:49:53
【问题描述】:

当我试图将一个元素插入到一个 scala 可变集合中时,我得到了以下输出。

我的代码如下。

object sets{
  def main(args:Array[String]):Unit={
    var set1 = Set(1,2,3,4);
    println(set1);
    println(set1.+(6));
  }
}

输出如下。

Set(1,2,3,4)
Set(1,6,2,3,4)

在 1 之后而不是 4 之后打印 6 是否有特定原因?

【问题讨论】:

  • A Set 没有订单:println(Set(1,2,3,4,5,6,7,8))

标签: scala set scala-collections


【解决方案1】:

集合中的顺序与插入元素的时间无关。公平地说,集合中的顺序概念并没有真正的意义,因为集合是无序的集合。

如果您想了解为什么会看到此顺序,这与对象的哈希码有关。我建议阅读Wikipedia article about Hashtables

如果您需要保留插入对象的顺序,可以使用List。要保持集合中元素的唯一性,您可以使用List.distinct

【讨论】:

    【解决方案2】:

    LinkedHashSet 像这样保留插入顺序

    val set1 = LinkedHashSet(1,2,3,4)
    println(set1)
    println(set1 += 6)
    

    哪个输出

    LinkedHashSet(1, 2, 3, 4)
    LinkedHashSet(1, 2, 3, 4, 6)
    

    解释here

    您需要保留项目的插入顺序。然后 你使用LinkedHashSet。几乎和普通HashSet一样快, 需要更多的存储空间来存储之间的附加链接 元素。

    注意LinkedHashSet和其他集合一样,不会保留重复,也就是

    assert(set1 == (set1 += 1)) // passes
    

    如果您不需要元素的唯一性,请考虑使用List

    【讨论】:

    • ListSet 足以维持秩序
    • @cchantep OP 似乎要求一个可变集。
    • 那么SortedSet 就足够了,不要与特定的 impl 耦合,除非明确需要
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多