Java中的Ordered Set的任何实现?

Uko*_*Uko 88 java collections set

如果有人熟悉Objective-C中有一种叫做集合NSOrderedSet充当及其项目可以作为访问数组的人.

Java中有这样的东西吗?

我听说有一个名为的集合LinkedHashMap,但是我找不到任何类似的集合.

Cha*_*har 106

看看LinkedHashSet

  • 为什么这个答案会得到这么多的赞成?这根本不是问题的答案.`LinkedHashSet`中没有函数可以让你找出元素所在的索引. (8认同)
  • [Class LinkedHashSet <E>](http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html) (3认同)

Gee*_*nte 30

每个Set都有一个迭代器().普通的HashSet迭代器是随机的,TreeSet按排序顺序执行,LinkedHashSet迭代器按插入顺序迭代.

但是,您无法替换LinkedHashSet中的元素.您可以删除一个并添加另一个,但新元素不会替换原始元素.在LinkedHashMap中,您可以替换现有键的值,然后值仍将按原始顺序排列.

此外,您不能插入某个位置.

也许你最好使用带有显式检查的ArrayList来避免插入重复项.


Mic*_*rdt 10

看一下Java标准API文档.就在附近LinkedHashMap,有一个LinkedHashSet.但请注意,那些顺序是插入顺序,而不是元素的自然顺序.并且您只能按该顺序迭代,而不是随机访问(除非通过计算迭代步骤).

还有一个SortedSetTreeSetand 实现的接口ConcurrentSkipListSet.两者都允许元素的自然顺序或a Comparator,但不是随机访问或插入顺序进行迭代.

对于既能通过索引进行高效访问又能有效实现set标准的数据结构,您需要一个跳过列表,但Java Standard API中没有该功能的实现,但我确信很容易找到一个在网上.


Mik*_*key 6

TreeSet已订购。

http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html

  • 有序和排序是不同的事情。TreeSet 是已排序的,而不是有序的 (51认同)
  • 确切地说,有序是指插入顺序(列表的工作方式),而排序是指基于某些标准对元素进行事后排序。 (5认同)

Tho*_*gum 5

尝试使用java.util.TreeSet该工具SortedSet

引用文档:

“元素使用它们的自然顺序进行排序,或者通过在集合创建时提供的比较器进行排序,具体取决于使用的构造函数”

请注意,添加、删除和包含具有时间成本 log(n)。

如果要将集合的内容作为数组访问,则可以执行以下操作:

YourType[] array = someSet.toArray(new YourType[yourSet.size()]); 
Run Code Online (Sandbox Code Playgroud)

该数组将使用与 TreeSet 相同的标准(自然或通过比较器)进行排序,并且在许多情况下,这比执行 Arrays.sort() 更有优势