如何使用其键获取LinkedHashMap中键/值的位置

时间:2012-04-30 16:40:37

标签: java linkedhashmap

您好我有一个LinkedHashMap(名为info),其中包含name / age(string / int)对。我想知道,如果我输入密钥,如何获得键/值的位置。例如,如果我的LinkedHashMap看起来像这样{bob = 12,jeremy = 42,carly = 21}并且我要搜索jeremy,它应该返回1作为它的位置1.我希望我可以使用类似info.getIndex的东西( “杰里米”)

6 个答案:

答案 0 :(得分:26)

HashMap一般来说,Iteration的订单无法订购。

LinkedHashMap 可预测Iteration订购(插入顺序),但不公开List界面和LinkedList(这是什么镜像键集插入顺序)也不跟踪索引位置本身,找到索引也非常低效。 LinkedHashMap也不会公开对内部LinkedList的引用。

  

实际的"链接列表" 行为是特定于实现的。一些   可能实际上使用了许多人只有LinkedList的实例   Entry跟踪上一个和下一个Entry并将其作为其使用   实现。不要在没有查看来源的情况下做任何事情。

包含密钥的KeySet也不保证顺序,因为用于放置在继承的HashMap的后备数据结构中的散列算法。所以你不能使用它。

在没有编写自己的实现的情况下,执行此操作的唯一方法是遍历使用镜像Iterator的{​​{1}}并保持计数您的位置,这将非常有效大数据集。

<强>解决方案

您想要的是原始广告订单索引位置,您必须将LinkedList中的密钥镜像为KeySet,并将其保留在与ArrayList的更新同步,并用它来查找位置。创建HashMap的子类,说HashMap并在内部添加此IndexedHashMap并添加委托给内部ArrayList .getKeyIndex(<K> key)的{​​{1}}可能是最好的解决方法。

这是ArrayList所做的事情,但.indexOf()镜像LinkedHashMap而不是LinkedList

答案 1 :(得分:13)

int pos = new ArrayList<String>(info.keySet()).indexOf("jeremy")

答案 2 :(得分:1)

我在

处看到了该问题的重复内容之一的建议

How get value from LinkedHashMap based on index not on key?

,我喜欢这个建议,如@schippi中的伪代码所述。我认为一些可以使用的Java代码可能会对这种方法的其他人有用

import java.util.ArrayList;
import java.util.LinkedHashMap;

public class IndexedLinkedHashMap<K,V> extends LinkedHashMap<K,V> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    ArrayList<K> al_Index = new ArrayList<K>();

    @Override
    public V put(K key,V val) {
        if (!super.containsKey(key)) al_Index.add(key);
        V returnValue = super.put(key,val);
        return returnValue;
    }

    public V getValueAtIndex(int i){
        return (V) super.get(al_Index.get(i));
    }

    public K getKeyAtIndex(int i) {
        return (K) al_Index.get(i);
    }

    public int getIndexOf(K key) {
        return al_Index.indexOf(key);
    }

}

答案 3 :(得分:0)

LinkedHashMap具有“可预测的迭代顺序”(javadoc)。但是,项目不知道它们的位置,因此您必须迭代该集合才能获得它。如果您要维护大型地图,则可能需要使用其他结构进行存储。

编辑:澄清迭代

答案 4 :(得分:0)

您可以使用 Google Guava库中的com.google.common.collect.LinkedListMultimap。你不需要这个类的多图行为,你想要的是keys()方法保证它们以插入顺序返回,然后可以用来构造一个List,你可以使用{{1} }找到所需的索引位置

答案 5 :(得分:0)

我确实将密钥的正子提取到一个并行映射中,如下所示:

在这里,对于Map,someListOfComplexObject()将是entrySet() 而getComplexStringKeyElem()将是getKey()

可能来自

robocopy /?