Answers:
该Set
接口不提供任何订购保证。
它的子接口SortedSet
代表根据某种标准排序的集合。在Java 6中,有两个实现的标准容器SortedSet
。他们是TreeSet
和ConcurrentSkipListSet
。
除了SortedSet
接口之外,还有LinkedHashSet
类。它记住元素插入到集合中的顺序,并以该顺序返回其元素。
LinkedHashSet是您所需要的。
List
不是Set
(它不能保证成员资格的唯一性)。
正如许多建议的成员使用LinkedHashSet保留集合的顺序。您可以使用此实现包装您的集合。
SortedSet实现可用于排序顺序,但出于您的目的,请使用LinkedHashSet。
同样从文档中
“此实现使客户摆脱了HashSet提供的未指定的,通常混乱的排序,而不会增加与TreeSet相关的成本。它可用于产生与原始顺序相同的集合副本,而不论原始序列如何集的实现:”
来源:http : //docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
这是Set
Java中可用的标准实现的顺序特征的简要概述:
对于您的特定情况,您可以先对项目进行排序,然后再使用1或2(最有可能是LinkedHashSet
或TreeSet
)中的任何一个。或者,或者更有效地,您可以将未排序的数据添加到中,TreeSet
该数据将自动为您进行排序。
要保留订单,请使用List
或LinkedHashSet
。
LinkedHashSet
,不是...... Map
。
LinkedHashSet是HashSet的有序版本,可在所有元素之间维护双链列表。当您关心迭代顺序时,请使用此类而不是HashSet。
从javadoc中获取Set.iterator()
:
返回此集合中元素的迭代器。元素以不特定的顺序返回(除非此集合是提供保证的某些类的实例)。
并且,如shuuchan所述,a TreeSet
是Set
具有保证顺序的实现:
元素使用其自然顺序或在集合创建时提供的Comparator进行排序,具体取决于所使用的构造函数。
Set返回的迭代器不应以有序方式返回数据。请参见同一集合的两个java.util.Iterators:它们是否必须以相同顺序返回元素?