为什么设置<integer>是对添加的值进行排序?</integer>

时间:2015-02-07 16:52:27

标签: java set java-collections-api

当我开始向Set<Integer>添加值时,我得到了排序元素。 请参考此示例:

Set<Integer> generated = new HashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);

我在这里排序Set [0, 1, 2]。我希望在添加generated对象时获得价值。

4 个答案:

答案 0 :(得分:2)

HashSet没有可预测的元素顺序。使用LinkedHashSet保留集合中元素的插入顺序:

  

Set接口的哈希表和链表实现,具有可预测的迭代顺序。

Set<Integer> generated = new LinkedHashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);

答案 1 :(得分:2)

首先,它只是您首次获得排序值的共同发生率。如果多次运行该代码,您将以某种随机顺序查看输出。这是因为HashSet并未强制对您添加的元素进行任何排序。

现在要按照您插入的顺序获取元素,您可以使用LinkedHashSet来维护插入顺序。

答案 2 :(得分:2)

HashSet并不保证元素的顺序。来自JavaDoc

  

它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

因此,为了保证订单LinkedHashSet可以使用。来自JavaDoc

  

Set接口的哈希表和链表实现,具有可预测的迭代顺序。

     

此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。

只需像这样实例化Set

Set<Integer> generated = new LinkedHashSet<>();

答案 3 :(得分:0)

首先,关于问题的标题,Set<Integer>只是声明类型,不负责任何排序/取消行为,这是使用{{1}的主要原因}界面是关心唯一性 - 它不允许重复,来自Javadocs:

的其他信息
  

Set是一个不能包含重复元素的Collection。

第二,它是纯粹的自信,你得到了排序集,当你在迭代时不关心订单时使用Set,来自{的更多信息{3}}

  

它不保证集合的迭代顺序;在   特别是,它不保证订单将保持不变   随着时间的推移。该类允许null元素。

第三次,关于您的需求:

  

我希望在添加到生成的对象时获得价值。

然后你需要使用HashSet来处理插入元素的顺序,再次来自javadocs:

  

此链接列表定义迭代排序,即顺序   哪些元素被插入到集合中(插入顺序)。注意   如果将元素重新插入到插入顺序中,则不会影响插入顺序   设置

您可以像这样使用它:

LinkedHashSet

第四个和最后一个,作为附加信息,您需要了解的另一个重要集合是Set<Integer> generated = new LinkedHashSet<Integer>(); ,它保证元素按升序排序,根据自然顺序,javadocs

  

元素按照它们的自然顺序排序,或者用   比较器在创建时设置,具体取决于哪个   使用构造函数