Java Set保留订单?

use*_*930 158 java sorting set

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

NPE*_*NPE 227

Set界面不提供任何订购保证.

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

除了SortedSet界面,还有LinkedHashSet类.它会记住元素插入集合的顺序,并按顺序返回元素.

  • 此外,由于Java 8中的[不同的字符串散列](http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/10361),集合中的默认(未排序)排序和地图会改变.如果您依赖未排序的顺序,则在Java 8下,您的代码的行为会有所不同. (19认同)

xia*_*.li 93

LinkedHashSet是你需要的.

  • `List`不是`Set`(它不保证成员资格的唯一性). (43认同)
  • 在许多业务独特的情况下,List不能仅用于保留订单而不是Set.LinkedHashSet维护订单并存储唯一. (9认同)

Lak*_*man 15

由于许多成员建议使用LinkedHashSet来保留集合的顺序.你可以使用这个实现来包装你的集合.

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

同样来自文档,

"这种实现使其客户端免受HashSet提供的未指定的,通常是混乱的排序,而不会增加与TreeSet相关的成本.它可用于生成与原始订单具有相同顺序的集合的副本,而不管原始集合集的实施:"

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


jav*_*ial 9

Set只是一个界面.为了保留顺序,您必须使用该接口的特定实现和子接口SortedSet,例如TreeSet或LinkedHashSet.你可以这样包装你的Set:

Set myOrderedSet = new LinkedHashSet(mySet);
Run Code Online (Sandbox Code Playgroud)


JHS*_*JHS 7

保留订单使用List或a LinkedHashSet.


ass*_*ias 6

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

  1. 保持插入顺序:LinkedHashSetCopyOnWriteArraySet(线程安全)
  2. 保持在集合中排序的项目:TreeSet,EnumSet(特定于枚举)和ConcurrentSkipListSet(线程安全)
  3. 不保留任何特定顺序的项目:HashSet(您尝试过的那个)

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


小智 6

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