我正在寻找java.util包中的数据结构。我需要它来满足以下要求:
我希望找到一个可索引的跳过列表,但我没有。他们是否有任何符合我所述要求的数据结构?
答案 0 :(得分:5)
Java标准库中没有这样的容器。
当我需要具有这些属性的数据结构时,我使用List
实现(通常为ArrayList
,但无关紧要),并使用{{3}执行所有插入操作}。
如果我必须将排序列表封装为可重用的类,我将实现List接口,将所有方法委托给'标准'List实现(它甚至可以作为参数传递给构造函数)。我通过抛出异常(UnsupportedOperationException
)来实现每个插入方法(add,addAll,set,Iterator的remove),这样就没有人可以破坏'always sorted'属性。最后,我提供了一个方法insertSorted
,可以使用Collections.binarySearch
进行插入。
答案 1 :(得分:3)
没有符合您所有标准的简单数据结构。
我所知道的唯一能够满足它们的是indexable skip list。 Hoewever,我不知道任何现成的Java实现。
答案 2 :(得分:2)
这个问题与
非常相似基本上它表明了以下内容:
class SortedArrayList<T> extends ArrayList<T> {
@SuppressWarnings("unchecked")
public void insertSorted(T value) {
add(value);
Comparable<T> cmp = (Comparable<T>) value;
for (int i = size()-1; i > 0 && cmp.compareTo(get(i-1)) < 0; i--) {
T tmp = get(i);
set(i, get(i-1));
set(i-1, tmp);
}
}
}
关于您的第一个要求的说明:“元素数量无限制。”:
您可能希望将此限制为“元素数量不应少于2 31 -1 ......”,否则您将排除所有选项由Java数组支持。 (你可以使用例如LinkedList来获取任意数量的元素,但我无法看到你如何在其中进行快速查找。)
答案 3 :(得分:1)
TreeSet
为您提供自然排序功能,同时向列表中添加元素。
但是如果你不需要这个并且允许使用Collections.sort(),你可以使用简单的ArrayList
。
答案 4 :(得分:0)
将List
与Collections.sort()
结合使用。
答案 5 :(得分:0)
使用List<T>
和Collections.sort()
所述的dwb,您可以使用ArrayList<T>
来实现List<T>
(并且不会像Vector<T>
那样同步,除非当然你想要那个开销)。这可能是你最好的选择,因为他们(Sun)通常会对这些领域进行大量研究(从我所见过的)。如果你需要按“默认”以外的其他东西排序(即你没有排序整数列表等),那么请提供你自己的比较器。
编辑:唯一不符合您要求的是快速删除...
答案 6 :(得分:-1)
如果您的数据结构中不需要类似的元素,那么通常的TreeSet也符合您的要求。