当我开始向Set<Integer>
添加值时,我得到了排序元素。
请参考此示例:
Set<Integer> generated = new HashSet<Integer>();
generated.add(2);
generated.add(1);
generated.add(0);
我在这里排序Set
[0, 1, 2]
。我希望在添加generated
对象时获得价值。
答案 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:
元素按照它们的自然顺序排序,或者用 比较器在创建时设置,具体取决于哪个 使用构造函数