Java 获取LinkedHashMap中最后一个键或值的最方便方法?
Java 获取LinkedHashMap中最后一个键或值的最方便方法?,java,key,linkedhashmap,Java,Key,Linkedhashmap,LinkedHashMapdescription说“它维护一个贯穿其所有条目的双链接列表”,所以我想知道如何获取最后输入的条目或密钥?我可以自信地向下转换.values()到链接列表以获得双链接列表并使用该列表的.getLast()?或者它是其他Java集合的一个实例 如果可能的话,我想继续使用java.util。不,对不起,您不能 “维护的双链接列表”不是任何java.util.LinkedList类型或其他集合。它是在LinkedHashMap和LinkedHashMap.Entry类中手动
LinkedHashMap
description说“它维护一个贯穿其所有条目的双链接列表”,所以我想知道如何获取最后输入的条目或密钥?我可以自信地向下转换.values()
到链接列表
以获得双链接列表并使用该列表的.getLast()
?或者它是其他Java集合的一个实例
如果可能的话,我想继续使用
java.util
。不,对不起,您不能
“维护的双链接列表”不是任何java.util.LinkedList类型或其他集合。它是在LinkedHashMap和LinkedHashMap.Entry类中手动实现的
只能从values()
生成LinkedList
,然后使用letLast()
:
Foo last=newlinkedlist(myLinkedHashMap.values()).getLast();
是的,您可以获取最后一个元素。但是,您必须查看其他人的建议,以获取由values()
返回的集合的最后一个元素
我在源代码中检查了返回值是否符合预期顺序:
由LinkedListMap.values()
返回的AbstractCollection
由迭代器支持,迭代器通过键直接链接到迭代器。显然,键上的迭代器是通过有序的双链表实现的。更新:我以前的答案是错误的。如果不修改默认行为,则无法执行此操作!请看下面的原因
。如何获取最后输入的条目或密钥?
从LinkedHashMap
的API描述中,您可以阅读:
结构修改是添加或删除一个或多个映射的任何操作,或者在访问顺序链接哈希映射的情况下,影响迭代顺序的任何操作。在插入顺序的链接哈希映射中,仅更改与映射中已包含的键相关联的值不是结构修改。在访问有序的链接哈希映射中,仅使用get查询映射是一种结构性修改
那么这一切意味着什么呢
- 按顺序访问-每次执行
put
或get
时,元素的顺序都会发生变化
- 按顺序插入-插入元素(第一次)时,元素最后添加
例如:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
。。。将按插入顺序打印{1=10,2=2}
,按*访问顺序打印{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);
}
}
toArray()
way:
Collection<V> values = map.values();
V v = values.toArray(new V[0])[values.size() - 1];
Collection values=map.values();
V=values.toArray(新的V[0])[values.size()-1];
使用迭代器迭代到最后一个元素:
Iterator<V> it = values.iterator();
V last = null;
while (it.hasNext())
last = it.next();
Iterator it=values.Iterator();
V last=null;
while(it.hasNext())
last=it.next();
我已经“扩展”了Jdk LinkedHashMap,您可以查看:方法values()
不返回列表视图或链接列表视图;而是返回一个集合
视图。返回的实际类型是一个名为Values
的私有类的实例,该类扩展了AbstractCollection
。您可以创建一个自定义类来存储最后输入的元素…b区域,是否将此注释作为答案?这是我最喜欢的,如果你这样做,我会接受它作为答案。使用java.util(没有反射)似乎不可能,但是看到这个解决方案的可能副本会遍历所有的值,而不是在O(1)中获得它-如果它是一个双链接列表,则应该如此。值得指出的是,文档中没有任何内容表明对LinkedHashMap的值进行迭代可以保证遵守映射的插入顺序。letLast()
=>您的意思是getLast()
?
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();