Java Set保留顺序?


177

Java Set是否保留顺序?有一种方法将Set返回给我,并且假定数据是有序的,但是遍历Set时,数据是无序的。有没有更好的方法来解决这个问题?是否需要更改方法以返回Set以外的内容?


3
“元素没有特别的顺序返回(除非该集合是提供保证的某些类的实例)。” 是集合的迭代器方法所说的。在此处
键盘输入2012年

Answers:


253

Set接口不提供任何订购保证。

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

除了SortedSet接口之外,还有LinkedHashSet类。它记住元素插入到集合中的顺序,并以该顺序返回其元素。


21
此外,由于Java 8中的String哈希不同,因此Sets和Maps中的默认(未排序)顺序将更改。如果靠未分类排序,你的代码将表现不同的Java 8下
rustyx

我知道该类不是按顺序排列的,这是正常的,但是我期望的行为是在引入它们时将它们保留下来,而不要弄乱该顺序,相反,它只是在每次聚合一个元素时对元素进行改组。您的解决方案不是最理想的选择,因为那时我将必须实现一个完整的结构以便对它们进行排序:引入它们的方式相同:S
White_King

@White_King:集合是一个数学概念,不包含“插入顺序”的概念,因此Java接口遵循其约定是有意义的。有顺序集,但是顺序由关系(Java中的比较器)指定,再次将集合论中的定义与Java中的定义匹配。您对它保持插入顺序的期望可能来自列表,但集不是列表。
康拉德·霍夫纳

102

LinkedHashSet是您所需要的。


43
A List不是Set(它不能保证成员资格的唯一性)。
有限赎罪者

10
在许多业务独特的情况下,不能仅使用List来保留订单,而不能使用Set。LinkedHashSet保持顺序并存储唯一。
小玩意

18

正如许多建议的成员使用LinkedHashSet保留集合的顺序。您可以使用此实现包装您的集合。

SortedSet实现可用于排序顺序,但出于您的目的,请使用LinkedHashSet

同样从文档中

“此实现使客户摆脱了HashSet提供的未指定的,通常混乱的排序,而不会增加与TreeSet相关的成本。它可用于产生与原始顺序相同的集合副本,而不论原始序列如何集的实现:”

来源:http : //docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html


9

Set只是一个接口。为了保持顺序,您必须使用该接口和子接口SortedSet的特定实现,例如TreeSet或LinkedHashSet。您可以通过以下方式包装Set:

Set myOrderedSet = new LinkedHashSet(mySet);

7

这是SetJava中可用的标准实现的顺序特征的简要概述:

  1. 保持插入顺序:LinkedHashSetCopyOnWriteArraySet(线程安全)
  2. 将项目保持在集合内排序:TreeSetEnumSet(特定于枚举)和ConcurrentSkipListSet(线程安全)
  3. 不会以任何特定顺序保留项目:HashSet(您尝试过的项目)

对于您的特定情况,您可以先对项目进行排序,然后再使用1或2(最有可能是LinkedHashSetTreeSet)中的任何一个。或者,或者更有效地,您可以将未排序的数据添加到中,TreeSet该数据将自动为您进行排序。


7

要保留订单,请使用ListLinkedHashSet


1
LinkedHashSet,不是...... Map
Marko Topolnik

我需要一个Set而不是一个List,我需要一个还可以保留我猜想的对象注入顺序的Set
White_King 19'Aug9


3

从javadoc中获取Set.iterator()

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

并且,如shuuchan所述,a TreeSetSet具有保证顺序的实现:

元素使用其自然顺序或在集合创建时提供的Comparator进行排序,具体取决于所使用的构造函数。


3

通常设置不会保持顺序,例如HashSet以便快速找到润色剂,但是您可以尝试LinkedHashSet它将保持您输入的顺序。


1

有2种不同的东西。

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



-2

只能SortedSetSet


问题是关于保留插入顺序(碰巧已排序)。
亚述
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.