2

当我开始添加价值时,Set<Integer>我得到了排序元素。请参考这个例子:

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

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

4

4 回答 4

2

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

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

Set<Integer> generated = new LinkedHashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);
于 2015-02-07T16:54:10.253 回答
2

首先,您第一次获得排序值只是一个巧合。如果您多次运行该代码,您将看到随机顺序的输出。那是因为 aHashSet不会对您添加的元素强制执行任何排序。

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

于 2015-02-07T16:55:24.893 回答
2

HashSet不保证元素的顺序。从JavaDoc

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

所以,为了保证顺序 aLinkedHashSet可以使用。从JavaDoc

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

该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。

只需像这样实例化您的Set

Set<Integer> generated = new LinkedHashSet<>();
于 2015-02-07T16:58:19.250 回答
0

首先,关于你的问题的标题,Set<Integer>只是声明类型,它不负责任何排序/取消排序行为,使用接口的主要原因Set是关心唯一性 - 它不允许重复,来自Javadocs 的附加信息:

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

其次,您获得了排序集纯属巧合,HashSet当您在迭代时不关心顺序时使用,来自javadocs的更多信息:

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

第三,关于你在找什么:

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

那么你需要使用LinkedHashSetwhich 来处理插入元素的顺序,同样来自javadocs

该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。请注意,如果将元素重新插入集合中,则插入顺序不受影响

您可以像这样简单地使用它:

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

第四和最后,作为附加信息,您需要注意的另一个重要集合是TreeSet保证元素将按照自然顺序升序排序的javadocs

元素使用其自然顺序或在集合创建时提供的 Comparator 进行排序,具体取决于使用的构造函数

于 2015-02-07T17:14:00.220 回答