2015-02-07 68 views
2

当我开始将值添加到Set<Integer>时,我得到排序元素。 请参考下面这个例子:为什么设置<Integer>正在排序附加值?

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

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

+0

的可能重复的[这是如何的HashSet产生排序输出?]( http://stackoverflow.com/questions/18648521/how-is-this-hashset-producing-sorted-output) – Radiodef 2015-02-08 01:25:18

回答

2

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

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

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

首先,它只是一个共同发病率,你得到排序值第一次。如果您多次运行该代码,您将以某种随机顺序看到输出。这是因为HashSet不会对您添加的元素执行任何排序。

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

2

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

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

所以,为了保证订单a可以使用LinkedHashSet。从JavaDoc

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

此链接列表定义了迭代排序,这是元素插入到集合中的顺序(插入顺序)。

简单的实例化你Set这样的:

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

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

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

其次,那就是你得到的有序set纯concidence,使用HashSet当你不通过它进行遍历时,从javadocs:

关心顺序,更多相关信息它不保证为集合的迭代次序;在 特别是,它不能保证该订单随着时间的推移将保持恒定 。这个类允许null元素。

,关于你在找什么:

我想,因为我加入到生成的对象中获取价值。

,那么你需要使用LinkedHashSetjavadocs负责其中的元素插入的顺序,再次:

此链接列表定义在 哪些元素迭代顺序,这是为了被插入到集合(插入顺序)中。需要注意的是,如果一个元素重新插入 设置

你可以使用它只是这样 插入顺序不受影响:

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

第四个和最后,作为附加信息,另一个重要的集合,你需要知道它,是TreeSet,它保证元素将按照自然顺序升序排序,​​:

的元件使用他们的自然顺序进行排序,或者由一 比较集合创建时提供,这取决于所使用 构造