适合快速获取和快速删除的java集合

时间:2013-10-05 19:45:06

标签: java

我想知道是否有适合“快速”get(通过索引)和“快速”删除的java接口。 “快”我的意思是比O(n)更好。

编辑:只有从集合中随机选择元素才需要get方法。此外,标题应该说“收集”而不是“界面”。

3 个答案:

答案 0 :(得分:4)

平衡二进制搜索树具有O(log n)“get”和“remove”操作。哈希表在O(1)时间内实现这些相同的操作。在Java中,您可以使用TreeMapHashMap类。例如:

TreeMap<Integer, String> map = new TreeMap<>();
map.put(0, "hello");
map.put(1, "world");
map.remove(0);

如果您不关心项目的顺序,可以使用ArrayList。当然“得到”是O(1)。要删除项目,请将最后一项移动到您删除的项目的位置,这会给您一个O(1)“删除”。那就是:

temp = list.remove(list.size()-1);
return list.set(index, temp);

答案 1 :(得分:1)

我不确定我是否理解你如何建议推断出你想要获取对象的索引。

如果您正在寻找快速get()和快速删除()操作 - 标准HashMap<Object, Object>有什么问题(即使用对象本身作为键)?

然后你的get()/ remove()操作将取决于你的hashCode()和equals()方法的实现,可以是O(1)

答案 2 :(得分:0)

我不认为JDK中的List实现比查找和删除的O(n)更快。

可能适合您的数据结构是ropeindexable skiplistenfilade。您可能能够找到可以在Web上使用的实现,或者在主要集合库(Guava,Commons Collections,Trove等)中使用的实现。

但是,如果您真正想要的不是快速查找和删除,而是快速随机选择和删除,您可以使用开放地址哈希表。您可以通过值获得O(1)查找(不是您关心的),按值删除O(1),以及选择随机值O(1)。您可以通过选择表中的随机插槽并使用其中的条目来选择随机值;如果它是空的,请再试一次。