首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取LinkedHashMap中最后一个键或值的最便捷方法是什么?

获取LinkedHashMap中最后一个键或值的最便捷方法是什么?
EN

Stack Overflow用户
提问于 2011-09-03 19:47:48
回答 4查看 10.1K关注 0票数 7

LinkedHashMap描述说“它维护了一个通过所有条目运行的双向链表”,所以我想知道如何输入最后一个条目或键?我是否可以自信地将.values()转换为LinkedList,以获得该双向链表并使用其中的.getLast()?或者它是其他Java集合的一个实例?

如果可能的话,我想坚持使用java.util

EN

回答 4

Stack Overflow用户

发布于 2011-09-03 20:30:54

是的,你可以得到最后一个元素。但您必须参考其他人的建议,才能获得values()返回的Collection<V>的最后一个元素。

我在源代码中检查了返回值确实是按照预期的顺序进行的:LinkedListMap.values()返回的AbstactCollection<V>由一个Iterator<V>支持,该值本身通过键直接链接到Iterator<K>。显然,键上的Iterator<K>是使用ordered双向链表实现的。

票数 1
EN

Stack Overflow用户

发布于 2011-09-03 20:04:43

不,对不起,你不能。

“维护的双向链表”不是任何java.util.LinkedList类型或其他集合。它在LinkedHashMap和LinkedHashMap.Entry类中手动实现。

您只能从values()构建LinkedList,然后使用letLast()

代码语言:javascript
复制
Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
票数 0
EN

Stack Overflow用户

发布于 2011-09-04 03:56:16

更新:我之前的回答是错的。如果不修改默认行为,您就无法做到这一点!请看下面的原因。

..how获取最后输入的条目或密钥?

LinkedHashMap的接口描述中可以看到:

结构修改是添加或删除一个或多个映射的任何操作,或者在访问排序链接哈希映射的情况下,影响迭代顺序的任何操作。在insertion-ordered链接的散列映射中,仅更改与映射中已包含的键相关联的值并不是一种结构修改。在access-ordered链接的散列映射中,仅使用get查询映射是一种结构上的修改。

那么这一切意味着什么呢?

  • access-ordered -每次执行putget时,元素的顺序为changes
  • insertion-ordered -当插入元素(第一次)时,它们将被添加到最后一次

例如:

代码语言:javascript
复制
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不能直接使用。因此,您可以包装它(不关心俗气的名称),并覆盖putputAll方法,以便它们先从映射中删除键,然后再将其放回!

代码语言:javascript
复制
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();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7292917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档