Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取LinkedHashMap中最后一个键或值的最方便方法?_Java_Key_Linkedhashmap - Fatal编程技术网

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();