LinkedHashMap
说明“它维护了一个双向链表,贯穿其所有条目”,所以我想知道如何输入最后一个条目或密钥?我可以自信地将.values()
转发给LinkedList
以获取该双重链接列表并使用.getLast()
吗?或者它是其他Java集合的实例?
如果可能,我想坚持java.util
。
答案 0 :(得分:1)
是的,你可以得到最后一个元素。但是,您必须查看其他人的建议,以获取Collection<V>
返回的values()
的最后一个元素。
我在源代码中检查了返回的值确实是预期的顺序:
AbstactCollection<V>
返回的LinkedListMap.values()
由Iterator<V>
支持,这些值本身直接链接到密钥上的Iterator<K>
。显然,密钥上的Iterator<K>
是使用有序双向链接列表实现的。
答案 1 :(得分:1)
更新:我之前的回答是错误的。如果不修改默认行为,就无法做到!见下面原因。
..如何输入最后一个条目或密钥?
从LinkedHashMap
的API说明中,您可以阅读:
结构修改是添加或删除一个或多个映射的任何操作,或者在访问顺序链接的哈希映射的情况下,影响迭代顺序。在 插入排序 链接的哈希映射中,仅更改与映射中已包含的键关联的值不是结构修改。在 访问顺序 链接的哈希映射中,仅使用get查询地图是一种结构修改。
那么这一切意味着什么?
put
或get
元素的顺序更改例如:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
...将使用 insert-ordered 打印{1=10, 2=2}
,并使用* access-ordered'打印{2=2, 1=10}
。问题是使用access-ordered
当然,如果您执行get
操作,订单也会更改。
所以...如何解决。那么LinkedHashMap
不能直接使用。所以你可以包装它(不关心corny名称)并覆盖put
和putAll
方法,以便在重新放入之前先从地图中删除密钥!
class BestLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
@Override
public V put(K key, V value) {
V last = super.remove(key);
super.put(key, value);
return last;
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for (K key : m.keySet())
super.remove(key);
super.putAll(m);
}
}
然后要获得最后一个元素,请执行以下操作:
将输出包装在LinkedList
实现中:
V v = new LinkedList<V>(map.values()).getLast();
toArray()
方式:
Collection<V> values = map.values();
V v = values.toArray(new V[0])[values.size() - 1];
使用迭代器迭代到最后一个元素:
Iterator<V> it = values.iterator();
V last = null;
while (it.hasNext())
last = it.next();
答案 2 :(得分:0)
不,对不起,你不能。
“维护的双向链表”不是任何java.util.LinkedList类型或其他集合。它在LinkedHashMap和LinkedHashMap.Entry类中手动实现。
您只能从LinkedList
构建values()
,然后使用letLast()
:
Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
答案 3 :(得分:0)
我已经扩展了#34; Jdk LinkedHashMap允许这样做,您可以查看:LinkedHashMapEx.java