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

时间:2011-09-03 11:47:48

标签: java key linkedhashmap

LinkedHashMap说明“它维护了一个双向链表,贯穿其所有条目”,所以我想知道如何输入最后一个条目或密钥?我可以自信地将.values()转发给LinkedList以获取该双重链接列表并使用.getLast()吗?或者它是其他Java集合的实例?

如果可能,我想坚持java.util

4 个答案:

答案 0 :(得分:1)

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

我在源代码中检查了返回的值确实是预期的顺序: AbstactCollection<V>返回的LinkedListMap.values()Iterator<V>支持,这些值本身直接链接到密钥上的Iterator<K>。显然,密钥上的Iterator<K>是使用有序双向链接列表实现的。

答案 1 :(得分:1)

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


  

..如何输入最后一个条目或密钥?

LinkedHashMap的API说明中,您可以阅读:

  

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

那么这一切意味着什么?

  • 访问顺序 - 每次执行putget元素的顺序更改
  • 插入订购 - 插入元素时(第一次)最后添加

例如:

map.put(1, 1); 
map.put(2, 2); 
map.put(1, 10);
System.out.println(map);

...将使用 insert-ordered 打印{1=10, 2=2},并使用* access-ordered'打印{2=2, 1=10}。问题是使用access-ordered当然,如果您执行get操作,订单也会更改。


如何修复

所以...如何解决。那么LinkedHashMap不能直接使用。所以你可以包装它(不关心corny名称)并覆盖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();
    

答案 2 :(得分:0)

不,对不起,你不能。

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

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

Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();

答案 3 :(得分:0)

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