7

LinkedHashMap描述说“它维护一个贯穿其所有条目的双向链表”所以我想知道如何获取最后一个条目或输入的键?我可以自信地沮丧.values()LinkedList获得该双向链表并使用.getLast()它吗?还是它是其他 Java 集合的实例?

如果可能的话,我想坚持下去java.util

4

4 回答 4

1

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

我在源代码中检查了返回的值确实符合预期的顺序:AbstactCollection<V>返回的值LinkedListMap.values()由 over 值支持,Iterator<V>该值本身直接链接到Iterator<K>over 键。显然,Iterator<K>over the keys 是用有序的双向链表实现的。

于 2011-09-03T12:30:54.073 回答
0

不,对不起,你不能。

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

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

Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
于 2011-09-03T12:04:42.593 回答
0

更新:我之前的回答是错误的。如果不修改默认行为,您将无法做到这一点!见下文为什么。


..如何获得最后一个条目或输入的键?

从您的 API 描述中LinkedHashMap可以阅读:

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

那么这一切意味着什么?

  • access-ordered - 每次执行 aput或 aget时,元素的顺序都会发生变化
  • insert -ordered - 插入元素时(第一次),它们最后添加

例如:

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打印。access-ordered当然,如果您进行操作,那么问题就在于使用get顺序也会发生变化。


怎么修

那么...如何解决。那么LinkedHashMap不能直接使用。所以你可以包装它(不要关心老生常谈的名字)并覆盖putputAll方法,以便他们在放回地图之前先从地图中删除密钥!

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();
    
于 2011-09-03T19:56:16.250 回答
0

我已经“扩展”了 Jdk LinkedHashMap 以允许这样做,您可以查看:LinkedHashMapEx.java

于 2015-06-21T18:10:34.577 回答