【发布时间】:2012-05-31 22:30:48
【问题描述】:
Java Set 是否保留顺序?一个方法正在向我返回一个 Set,并且据说数据是有序的,但在 Set 上迭代时,数据是无序的。有没有更好的方法来管理这个?是否需要更改方法以返回 Set 以外的内容?
【问题讨论】:
-
“元素的返回顺序不明确(除非该集合是某个提供保证的类的实例)。”是集合的迭代器方法所说的。找到here
Java Set 是否保留顺序?一个方法正在向我返回一个 Set,并且据说数据是有序的,但在 Set 上迭代时,数据是无序的。有没有更好的方法来管理这个?是否需要更改方法以返回 Set 以外的内容?
【问题讨论】:
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 只是一个接口。为了保持顺序,您必须使用该接口和子接口 SortedSet 的特定实现,例如 TreeSet 或 LinkedHashSet。你可以用这种方式包装你的 Set:
Set myOrderedSet = new LinkedHashSet(mySet);
【讨论】:
要保留订单,请使用List 或LinkedHashSet。
【讨论】:
LinkedHashSet,而不是...Map。
以下是 Java 中可用的标准 Set 实现的顺序特征的快速总结:
对于您的具体情况,您可以先对项目进行排序,然后使用 1 或 2 中的任何一个(很可能是 LinkedHashSet 或 TreeSet)。或者,更有效地,您可以将未排序的数据添加到 TreeSet,它会自动为您处理排序。
【讨论】:
LinkedHashSet 是 HashSet 的有序版本,它维护一个跨所有元素的双向链表。当您关心迭代顺序时,请使用此类而不是 HashSet。
【讨论】:
来自Set.iterator()的javadoc:
返回此集合中元素的迭代器。返回的元素没有特定的顺序(除非这个集合是某个提供保证的类的实例)。
而且,正如shuuchan 所述,TreeSet 是具有保证顺序的Set 的实现:
元素使用它们的自然顺序或在集合创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。
【讨论】:
一般set是不保持顺序的,比如HashSet是为了快速找到一个元素,但是你可以试试LinkedHashSet它会保持你输入的顺序。
【讨论】:
有两种不同的东西。
【讨论】:
Set 接口本身并没有规定任何特定的顺序。但是,SortedSet 确实如此。
【讨论】:
Set 返回的迭代器不应该以有序的方式返回数据。 看到这个Two java.util.Iterators to the same collection: do they have to return elements in the same order?
【讨论】:
只有SortedSet可以对Set进行排序
【讨论】: