是否可以通过其位置从HashMap获取元素?

Eug*_*ene 92 java hashmap

如何通过HashMap的位置从HashMap中检索元素,它有可能吗?

小智 102

使用LinkedHashMap,当您需要按位置检索时,将值转换为ArrayList.

LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<String,String>();
/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");
/* Get by position */
int pos = 1;
String value = (new ArrayList<String>(linkedHashMap.values())).get(pos);
Run Code Online (Sandbox Code Playgroud)

  • 总是需要从HashMap实例化一个键的副本? (2认同)

Way*_*ett 91

HashMaps不保留排序:

这个类不保证地图的顺序; 特别是,它不保证订单会随着时间的推移保持不变.

看看LinkedHashMap,它保证了可预测的迭代顺序.

  • 这并没有真正回答这个问题.下面的其他答案更有用. (14认同)
  • 相对而言,这引用了*直接*回答问题的文档 (5认同)

小智 45

如果要维护将元素添加到地图的顺序,请使用LinkedHashMap而不是仅使用HashMap.

这是一种允许您通过地图中的索引获取值的方法:

public Object getElementByIndex(LinkedHashMap map,int index){
    return map.get( (map.keySet().toArray())[ index ] );
}
Run Code Online (Sandbox Code Playgroud)


the*_*247 17

如果由于某种原因,您必须坚持使用hashMap,您可以将keySet转换为数组并索引数组中的键以获取地图中的值,如下所示:

Object[] keys = map.keySet().toArray();
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问地图,如:

map.get(keys[i]);
Run Code Online (Sandbox Code Playgroud)


ila*_*lex 12

用途LinkedHashMap:

Map接口的哈希表和链表实现,具有可预测的迭代顺序.此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表.

  • 这将保留订单,但您仍然无法通过索引访问项目.你必须迭代 (27认同)

Jef*_*Lee 6

使用LinkedHashMap并使用此功能.

private LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
Run Code Online (Sandbox Code Playgroud)

像这样定义和.

private Entry getEntry(int id){
        Iterator iterator = map.entrySet().iterator();
        int n = 0;
        while(iterator.hasNext()){
            Entry entry = (Entry) iterator.next();
            if(n == id){
                return entry;
            }
            n ++;
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

该函数可以返回所选条目.