我很困惑,我找不到一个快速的答案。我本质上是在 Java 中寻找一个数据结构,它实现了 java.util.List
接口,但是以排序的顺序存储它的成员。我知道你可以使用一个正常的 ArrayList
和 Collections.sort()
,但我有一个场景,我偶尔添加和经常检索成员从我的列表,我不想要排序,每次我检索一个成员,以防一个新的已经被添加。有人能告诉我 JDK 甚至第三方库中存在这样的东西吗?
EDIT : 数据结构将需要保留重复内容。
答案的总结 : 我发现这一切都很有趣,学到了很多东西。Aioobe 特别值得一提,因为他坚持不懈地试图达到我上面的要求(主要是一个分类的 java.util。支持重复的列表实现)。我已经接受了他的回答,认为他的回答对于我所问的问题是最准确的,对于我所寻找的东西的含义也是最发人深省的,即使我所问的并不完全是我所需要的。
我所要求的问题在于 List 接口本身和接口中可选方法的概念。引用 javadoc 的话:
此接口的用户可以精确控制列表中每个元素的插入位置。
插入到已排序列表中并不能精确控制插入点。然后,您必须考虑如何处理其中的一些方法。以 add
为例:
Public boolean add (对象 o)
Appends the specified element to the end of this list (optional operation).
你现在处于任何一种不舒服的境地
1)打破合同,实现添加的排序版本
2)让 add
添加一个元素到列表的末尾,打破你的排序顺序
3)通过抛出一个 UnsupportedOperationException
并实现另一个按排序顺序添加项目的方法,将 add
(作为可选项)排除在外。
选项3可能是最好的,但是我发现一个不能使用的 add 方法和另一个不在接口中的 sortedAdd 方法令人讨厌。
其他相关解决方案(不分先后) :
add(Object obj)
方法中实现排序打破了 List 接口的约定,并且奇怪地对 add(int index, Object obj)
没有效果方法。一般共识认为,在这种情况下,throw new UnsupportedOperationException()
可能是一个更好的选择。Warning: This class breaks the contract required by List
中有一个警告