Java HashMap:如何通过索引获取密钥和值?

Der*_*rek 29 java iteration hashmap

我试图使用HashMap将唯一的字符串映射到字符串ArrayList,如下所示:

HashMap<String, ArrayList<String>>
Run Code Online (Sandbox Code Playgroud)

基本上,我希望能够通过编号访问密钥,而不是使用密钥的名称.我希望能够访问所述密钥的值,迭代它.我想象的是这样的:

for(all keys in my hashmap) {
    for(int i=0; i < myhashmap.currentKey.getValue.size(); i++) {
        // do things with the hashmaps elements
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有捷径可寻?

小智 64

如果您真的只想要第一个键的值,这是一般解决方案

Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
Run Code Online (Sandbox Code Playgroud)

  • 非常严格...... OP要求*值*,而不是*键*.所以你可能想要添加`Object myValue = myMap.get(myKey);` (6认同)
  • 我不确定 `toArray()` 的(潜在)开销是否优于 `iterator().next()`... (2认同)

Cam*_*ner 34

您可以通过调用迭代密钥map.keySet(),或通过调用迭代条目map.entrySet().迭代条目可能会更快.

for (Map.Entry<String, List<String>> entry : map.entrySet()) {
    List<String> list = entry.getValue();
    // Do things with the list
}
Run Code Online (Sandbox Code Playgroud)

如果你想确保按照插入它们的顺序迭代键,那么使用a LinkedHashMap.

顺便说一句,我建议将地图的声明类型更改为<String, List<String>>.总是最好根据接口而不是实现来声明类型.


can*_*ler 9

Kotlin HashMap 答案

您可以通过索引获取键。然后通过key获取value。

val item = HashMap<String, String>() // Dummy HashMap.

val keyByIndex = item.keys.elementAt(0) // Get key by index. I selected "0".

val valueOfElement = item.getValue(keyByIndex) // Get value.
Run Code Online (Sandbox Code Playgroud)


Jef*_*rey 8

除非您使用LinkedHashMap或,否则不会订购HashMaps SortedMap.在这种情况下,您可能需要一个LinkedHashMap.这将按插入顺序迭代(或者如果您愿意,按照上次访问的顺序).在这种情况下,它会

int index = 0;
for ( Map.Entry<String,ArrayList<String>> e : myHashMap.iterator().entrySet() ) {
    String key = e.getKey();
    ArrayList<String> val = e.getValue();
    index++;
}
Run Code Online (Sandbox Code Playgroud)

地图中没有直接的get(索引),因为它是一个无序的键/值对列表.LinkedHashMap是一个保持秩序的特殊情况.