Java Set保留订单?

时间:2012-05-25 10:27:02

标签: java sorting set

Java Set是否保留订单?一个方法正在向我返回一个Set,并且假设数据是有序的但是迭代了Set,数据是无序的。有没有更好的方法来管理这个?是否需要更改方法以返回除Set之外的其他内容?

13 个答案:

答案 0 :(得分:206)

Set接口不提供任何排序​​保证。

其子接口SortedSet表示根据某个标准排序的集合。在Java 6中,有两个标准容器实现SortedSet。它们是TreeSetConcurrentSkipListSet

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)

要保留订单,请使用ListLinkedHashSet

答案 5 :(得分:6)

以下是Java中可用的标准Set实现的顺序特征的快速摘要:

  1. 保留广告订单:LinkedHashSetCopyOnWriteArraySet(线程安全)
  2. 将项目保存在集合中:TreeSetEnumSet(特定于枚举)和ConcurrentSkipListSet(线程安全)
  3. 不会按任何特定顺序保留这些项目:HashSet(您尝试过的那个)
  4. 对于您的具体情况,您可以先对项目进行排序,然后使用1或2中的任意一个(最有可能是LinkedHashSetTreeSet)。或者更有效率,您只需将未分类的数据添加到TreeSet即可自动为您排序。

答案 6 :(得分:3)

来自Set.iterator()的javadoc:

  

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

而且,正如shuuchan已经说明的那样,TreeSetSet的有保证订单的实现:

  

元素按照其自然顺序排序,或者在创建时创建时提供的比较器,具体取决于使用的构造函数。

答案 7 :(得分:3)

通常设置不保留顺序,例如HashSet以便快速找到emelent,但是你可以尝试使用LinkedHashSet它会保留你输入的顺序。

答案 8 :(得分:3)

LinkedHashSet是HashSet的有序版本,它维护所有元素的双向链接列表。在关心迭代顺序时,请使用此类而不是HashSet。

答案 9 :(得分:0)

Set接口本身没有规定任何特定的顺序。然而,SortedSet确实如此。

答案 10 :(得分:0)

答案 11 :(得分:0)

有2种不同的东西。

  1. 对一组元素进行排序。为此,我们有SortedSet和类似的实现。
  2. 保持一组中的插入顺序。可以使用LinkedHashSet和CopyOnWriteArraySet(线程安全)。

答案 12 :(得分:-1)

只有SortedSet可以对Set

进行排序