LinkedHashMap描述说“它维护了一个通过所有条目运行的双向链表”,所以我想知道如何输入最后一个条目或键?我是否可以自信地将.values()转换为LinkedList,以获得该双向链表并使用其中的.getLast()?或者它是其他Java集合的一个实例?
如果可能的话,我想坚持使用java.util。
发布于 2011-09-03 20:30:54
是的,你可以得到最后一个元素。但您必须参考其他人的建议,才能获得values()返回的Collection<V>的最后一个元素。
我在源代码中检查了返回值确实是按照预期的顺序进行的:LinkedListMap.values()返回的AbstactCollection<V>由一个Iterator<V>支持,该值本身通过键直接链接到Iterator<K>。显然,键上的Iterator<K>是使用ordered双向链表实现的。
发布于 2011-09-03 20:04:43
不,对不起,你不能。
“维护的双向链表”不是任何java.util.LinkedList类型或其他集合。它在LinkedHashMap和LinkedHashMap.Entry类中手动实现。
您只能从values()构建LinkedList,然后使用letLast():
Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();发布于 2011-09-04 03:56:16
更新:我之前的回答是错的。如果不修改默认行为,您就无法做到这一点!请看下面的原因。
..how获取最后输入的条目或密钥?
从LinkedHashMap的接口描述中可以看到:
结构修改是添加或删除一个或多个映射的任何操作,或者在访问排序链接哈希映射的情况下,影响迭代顺序的任何操作。在insertion-ordered链接的散列映射中,仅更改与映射中已包含的键相关联的值并不是一种结构修改。在access-ordered链接的散列映射中,仅使用get查询映射是一种结构上的修改。
那么这一切意味着什么呢?
put或get时,元素的顺序为changes例如:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);..。将打印带有插入顺序的{1=10, 2=2}和带有*access-ordered的{2=2, 1=10}。问题在于使用access-ordered,当然,如果您执行get操作,顺序也会发生变化。
如何修复
所以..。如何修复。LinkedHashMap不能直接使用。因此,您可以包装它(不关心俗气的名称),并覆盖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=新的LinkedList(map.values()).getLast();
toArray()方式:集合值= map.values();V v=values.toArray(新V)values.size() -1;
迭代器it = values.iterator();V last = null;while (it.hasNext()) last = it.next();
https://stackoverflow.com/questions/7292917
复制相似问题