Java集保留顺序?

Java集保持顺序吗? 一个方法是返回一个集合给我,据说数据是​​有序的,但在集合上迭代,数据是无序的。 有没有更好的方法来pipe理这个? 该方法是否需要改变返回一个集合以外的东西?

Set界面不提供任何顺序保证。

它的子接口SortedSet表示一个按照某种标准sorting的集合。 在Java 6中,有两个实现SortedSet标准容器。 它们是TreeSetConcurrentSkipListSet

除了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); 

保留订单使用ListLinkedHashSet

Set.iterator()的javadoc中:

返回此集合中元素的迭代器。 元素以特定的顺序返回(除非这个集合是某个提供担保的类的实例)。

而且,正如shuuchan所述 , TreeSetSet一个实现,它有一个保证的顺序:

这些元素是按照自然顺序sorting的,或者是在创build集合时提供的比较器,具体取决于使用哪个构造函数。

通常设置不保留顺序,比如HashSet以便快速find一个emelent,但是你可以试试LinkedHashSet它会保持你放入的顺序。

以下是Java中可用的标准Set实现的顺序特性的简要总结:

  1. 保持插入顺序: LinkedHashSet和CopyOnWriteArraySet (线程安全)
  2. 保持在集合中sorting的项目: TreeSet , EnumSet (特定于枚举)和ConcurrentSkipListSet (线程安全)
  3. 不保持项目的任何特定顺序: HashSet (你尝试的)

对于您的具体情况,您可以先sorting项目,然后使用1或2(最有可能LinkedHashSetTreeSet )中的任何一个。 或者,也可以更高效地将未sorting的数据添加到TreeSet ,该TreeSet将自动为您处理sorting。

Set接口本身并没有规定任何特定的顺序。 SortedSet不过。

迭代器返回的Iterator并不假设以有序的方式返回数据。 看到这两个java.util.Iterators到相同的集合:他们必须以相同的顺序返回元素?

只有SortedSet可以完成Set的sorting