Java Set是否保留订单?一个方法正在向我返回一个Set,并且假设数据是有序的但是迭代了Set,数据是无序的。有没有更好的方法来管理这个?是否需要更改方法以返回除Set之外的其他内容?
答案 0 :(得分:206)
Set
接口不提供任何排序保证。
其子接口SortedSet
表示根据某个标准排序的集合。在Java 6中,有两个标准容器实现SortedSet
。它们是TreeSet
和ConcurrentSkipListSet
。
除SortedSet
接口外,还有LinkedHashSet
类。它会记住元素插入集合的顺序,并按顺序返回元素。
答案 1 :(得分:78)
LinkedHashSet就是您所需要的。
答案 2 :(得分:14)
许多成员建议使用 LinkedHashSet 来保留集合的顺序。 你可以使用这个实现来包装你的集合。
SortedSet 实施可用于排序顺序,但出于您的目的,请使用 LinkedHashSet 。
同样来自文档,
“此实现使其客户端免受HashSet提供的未指定的,通常混乱的排序,而不会增加与TreeSet相关的成本。它可用于生成与原始订单具有相同顺序的集合的副本,无论如何原始集合的实现:“
来源:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
答案 3 :(得分:8)
Set只是一个界面。为了保留顺序,您必须使用该接口的特定实现和子接口SortedSet,例如TreeSet或LinkedHashSet。你可以这样包装你的Set:
Set myOrderedSet = new LinkedHashSet(mySet);
答案 4 :(得分:8)
要保留订单,请使用List
或LinkedHashSet
。
答案 5 :(得分:6)
以下是Java中可用的标准Set
实现的顺序特征的快速摘要:
对于您的具体情况,您可以先对项目进行排序,然后使用1或2中的任意一个(最有可能是LinkedHashSet
或TreeSet
)。或者更有效率,您只需将未分类的数据添加到TreeSet
即可自动为您排序。
答案 6 :(得分:3)
来自Set.iterator()
的javadoc:
返回此set中元素的迭代器。元素以无特定顺序返回(除非此集合是某个提供保证的类的实例)。
而且,正如shuuchan已经说明的那样,TreeSet
是Set
的有保证订单的实现:
元素按照其自然顺序排序,或者在创建时创建时提供的比较器,具体取决于使用的构造函数。
答案 7 :(得分:3)
通常设置不保留顺序,例如HashSet以便快速找到emelent,但是你可以尝试使用LinkedHashSet它会保留你输入的顺序。
答案 8 :(得分:3)
LinkedHashSet是HashSet的有序版本,它维护所有元素的双向链接列表。在关心迭代顺序时,请使用此类而不是HashSet。
答案 9 :(得分:0)
Set接口本身没有规定任何特定的顺序。然而,SortedSet确实如此。
答案 10 :(得分:0)
Set返回的迭代器不会以Ordered方式返回数据。 见Two java.util.Iterators to the same collection: do they have to return elements in the same order?
答案 11 :(得分:0)
有2种不同的东西。
答案 12 :(得分:-1)
只有SortedSet
可以对Set