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

时间:2010-10-19 23:08:35

标签: java iteration hashmap

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

HashMap<String, ArrayList<String>>

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

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

有一种简单的方法吗?

12 个答案:

答案 0 :(得分:60)

如果你真的只想要第一个键值

,这是一般解决方案
Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);

答案 1 :(得分:31)

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

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

如果您想确保以您插入的顺序迭代键,请使用LinkedHashMap

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

答案 2 :(得分:8)

除非您使用LinkedHashMapSortedMap,否则不会对HashMaps进行排序。在这种情况下,您可能需要LinkedHashMap。这将按插入顺序迭代(或者如果您愿意,按照上次访问的顺序)。在这种情况下,它将是

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

地图中没有直接获取(索引),因为它是键/值对的无序列表。 LinkedHashMap是保持订单的特殊情况。

答案 3 :(得分:2)

for (Object key : data.keySet()) {
    String lKey = (String) key;
    List<String> list = data.get(key);
}

答案 4 :(得分:2)

已选择解决方案。但是,我为那些想要使用替代方法的人发布了这个解决方案:

// use LinkedHashMap if you want to read values from the hashmap in the same order as you put them into it
private ArrayList<String> getMapValueAt(LinkedHashMap<String, ArrayList<String>> hashMap, int index)
{
    Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) hashMap.entrySet().toArray()[index];
    return entry.getValue();
}

答案 5 :(得分:2)

我遇到了同样的问题,从不同的相关问题中读了几个答案,并提出了自己的课程。

public class IndexableMap<K, V> extends HashMap<K, V> {

    private LinkedList<K> keyList = new LinkedList<>();

    @Override
    public V put(K key, V value) {
        if (!keyList.contains(key))
            keyList.add(key);
        return super.put(key, value);
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        for (Entry<? extends K, ? extends V> entry : m.entrySet()) {
            put(entry.getKey(), entry.getValue());
        }
    }

    @Override
    public void clear() {
        keyList.clear();
        super.clear();
    }

    public List<K> getKeys() {
        return keyList;
    }

    public int getKeyIndex(K key) {
        return keyList.indexOf(key);
    }

    public K getKeyAt(int index) {
        if (keyList.size() > index)
            return keyList.get(index);
        return null;
    }

    public V getValueAt(int index) {
        K key = getKeyAt(index);
        if (key != null)
            return get(key);
        return null;
    }
}

示例(为清晰起见,类型与OPs问题有所不同)

Map<String, Double> myMap = new IndexableMap<>();

List<String> keys = myMap.getKeys();
int keyIndex = myMap.getKeyIndex("keyString");
String key = myMap.getKeyAt(2);
Double value myMap.getValueAt(2);

请记住,它不会覆盖任何复杂的方法,因此,如果您要可靠地访问其中一种方法,则需要自己进行操作。

编辑:我对putAll()方法进行了更改,因为旧的方法极少有机会导致HashMap和LinkedList处于不同的状态。

答案 6 :(得分:1)

你可以这样做:

for(String key: hashMap.keySet()){
    for(String value: hashMap.get(key)) {
        // use the value here
    }
}

这将迭代每个键,然后列表中每个键与每个键相关联。

答案 7 :(得分:0)

HashMaps不会按特定顺序保留您的键/值对。它们是根据每个键从Object.hashCode()方法返回的哈希值排序的。但是,您可以使用迭代器迭代一组键/值对:

for (String key : hashmap.keySet()) 
{
    for (list : hashmap.get(key))
    {
        //list.toString()
    }
}

答案 8 :(得分:0)

如果您不关心实际的密钥,那么迭代所有 Map的值的简明方法是使用其values()方法

Map<String, List<String>> myMap;

for ( List<String> stringList : myMap.values() ) {
    for ( String myString : stringList ) {
        // process the string here
    }
}

values()方法是Map接口的一部分,并返回地图中值的Collection视图。

答案 9 :(得分:0)

您可以使用Kotlin扩展功能

fun LinkedHashMap<String, String>.getKeyByPosition(position: Int) =
        this.keys.toTypedArray()[position]


fun LinkedHashMap<String, String>.getValueByPosition(position: Int) =
        this.values.toTypedArray()[position]

答案 10 :(得分:0)

例如,您需要像这样创建多个 HashMap

display: none

答案 11 :(得分:0)

Kotlin HashMap 答案

可以通过索引获取key。然后通过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.