Java集保留顺序?
Java集保持顺序吗? 一个方法是返回一个集合给我,据说数据是有序的,但在集合上迭代,数据是无序的。 有没有更好的方法来pipe理这个? 该方法是否需要改变返回一个集合以外的东西?
Set
界面不提供任何顺序保证。
它的子接口SortedSet
表示一个按照某种标准sorting的集合。 在Java 6中,有两个实现SortedSet
标准容器。 它们是TreeSet
和ConcurrentSkipListSet
。
除了SortedSet
接口之外,还有LinkedHashSet
类。 它记得元素被插入到集合中的顺序,并按顺序返回它的元素。
LinkedHashSet是你所需要的。
由于许多成员build议使用LinkedHashSet来保留集合的顺序。 你可以使用这个实现包装你的设置。
SortedSet实现可以用于sorting顺序,但为了您的目的使用LinkedHashSet。
另外从文档中,
“这种实现将客户端从HashSet提供的未指定的,通常是混沌的sorting中排除,而不会增加与TreeSet相关的成本增加,它可以用来生成一个与原始序列相同的集合的副本,而不pipe原始集的实现:“
来源: http : //docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
设置只是一个界面。 为了保留顺序,您必须使用该接口和子接口SortedSet的特定实现,例如TreeSet或LinkedHashSet。 你可以这样包装你的Set:
Set myOrderedSet = new LinkedHashSet(mySet);
保留订单使用List
或LinkedHashSet
。
从Set.iterator()
的javadoc中:
返回此集合中元素的迭代器。 元素以特定的顺序返回(除非这个集合是某个提供担保的类的实例)。
而且,正如shuuchan所述 , TreeSet
是Set
一个实现,它有一个保证的顺序:
这些元素是按照自然顺序sorting的,或者是在创build集合时提供的比较器,具体取决于使用哪个构造函数。
通常设置不保留顺序,比如HashSet以便快速find一个emelent,但是你可以试试LinkedHashSet它会保持你放入的顺序。
以下是Java中可用的标准Set
实现的顺序特性的简要总结:
- 保持插入顺序: LinkedHashSet和CopyOnWriteArraySet (线程安全)
- 保持在集合中sorting的项目: TreeSet , EnumSet (特定于枚举)和ConcurrentSkipListSet (线程安全)
- 不保持项目的任何特定顺序: HashSet (你尝试的)
对于您的具体情况,您可以先sorting项目,然后使用1或2(最有可能LinkedHashSet
或TreeSet
)中的任何一个。 或者,也可以更高效地将未sorting的数据添加到TreeSet
,该TreeSet
将自动为您处理sorting。
Set接口本身并没有规定任何特定的顺序。 SortedSet不过。
迭代器返回的Iterator并不假设以有序的方式返回数据。 看到这两个java.util.Iterators到相同的集合:他们必须以相同的顺序返回元素?
只有SortedSet
可以完成Set
的sorting