在Java中,有没有办法从LinkedList集合中获取一个元素 如果我可以存储元素插入列表的位置,在恒定时间?我无法使用ArrayList,因为我想在常量时间从列表中间删除项目。
LinkedList' s get接受int作为参数,复杂度为O(N)。
在C ++中,我可以使用map来存储列表的迭代器。要在常量时间访问任何元素,我可以在哈希表中查找元素并获取迭代器。使用迭代器我可以到列表中的那个条目。
这是一段代码片段,展示了如何在C ++中完成它。该程序不需要LinkedList和HashMap。但想象一下像LRU Cache或者我想要维护列表和地图的不同场景。
list<string> namesList;
unordered_map<string, list<string>::iterator> namesMap;
namesList.push_front("hello");
namesMap["hello"] = namesList.begin();
namesList.push_front("hi");
namesMap["hi"] = namesList.begin();
namesList.push_front("abc");
namesMap["abc"] = namesList.begin();
// Now to access "hi" on the list, I can just look it up on the map
// Get iterator to "hi" from the map and access it
auto itr = namesMap.find("hi");
if (itr != namesMap.end())
{
// This is a simple case where my list is just storing the key
cout << *(itr->second) << endl;
}
答案 0 :(得分:3)
java.util.LinkedHashMap
听起来就像你想要的那样(包括LRU案例)。对于更精细的缓存情况,您可能需要来自Guava库的com.google.common.cache.Cache
。
没有办法存储指向Java LinkedList
中特定节点的指针,实际上LinkedList
是一个相当无用的实现 - 即使编写它的Josh Bloch也不推荐它了。如果您的需求比LinkedList
和LinkedHashMap
可以处理的更专业,那么您应该只构建自己的链表实现 - 它实际上是最简单的数据结构。
答案 1 :(得分:0)
Hashmap总是能够更好地查找元素而不是List。 这是数据结构本身的限制。
在Java中,您可以实现Hashmap以在恒定时间获取任何元素。 但是在List中搜索List中元素的最佳算法(排序列表) 是一个二进制搜索,花费O(log n)。