LinkedHashMap
的描述中提到“它维护一个双向链表,遍历所有条目”,那么我想知道如何获取最后一个输入的条目或键?我能否自信地将.values()
向下转换为LinkedList
来获取该双向链表并使用.getLast()
呢?还是它是Java集合的其他实例?如果可能的话,我想坚持使用java.util
。LinkedHashMap
的描述中提到“它维护一个双向链表,遍历所有条目”,那么我想知道如何获取最后一个输入的条目或键?我能否自信地将.values()
向下转换为LinkedList
来获取该双向链表并使用.getLast()
呢?还是它是Java集合的其他实例?如果可能的话,我想坚持使用java.util
。是的,您可以获取最后一个元素。但是您需要查看其他人的建议,以获取由values()
返回的Collection<V>
的最后一个元素。
我在源代码中检查了返回的值确实按预期顺序排列:
LinkedListMap.values()
返回的AbstactCollection<V>
由一个Iterator<V>
支持,该迭代器本身直接链接到Iterator<K>
上。显然,Iterator<K>
是使用有序双向链表实现的。
不好意思,你不能这样做。
“维护的双向链表”不是任何java.util.LinkedList类型或其他集合。它是在LinkedHashMap和LinkedHashMap.Entry类中手动实现的。
你只能从values()
构建LinkedList
,然后使用letLast()
:
Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
letLast()
=> 你是不是想说 getLast()
? - null更新:我之前的回答是错误的。如果不修改默认行为,您无法这样做!请看下面的原因。
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
...将使用插入排序
打印{1=10, 2=2}
,并使用访问顺序
打印{2=2, 1=10}
。问题在于,使用访问顺序
时,如果进行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 = 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();
values()
不返回List<>
视图或LinkedList<>
视图;而是返回一个Collection<>
视图。实际返回的类型是一个名为Values
的私有类的实例,该类扩展了AbstractCollection<>
。 - Swaranga Sarma