使用索引获取地图值对

时间:2014-11-05 19:57:23

标签: java collections map

有没有办法通过使用索引而不是LinkedHashMap循环来迭代foreach(具有已定义的顺序)?我需要使用索引来访问元素。

以下代码打印整个地图:

public void print(Map<String, Integer> map)
{
    for (Map.Entry<String, Integer> entryMap : map.entrySet())
    {
        System.out.println(entryMap.getValue() + " = " + entryMap.getKey());
    }
}

我怎么能这样做但是使用索引来访问元素呢?

public void print(Map<String, Integer> map)
{
    for (int i = 0; i< map.size(); i++)
    {
        // getValue() and getKey() are undefined
        System.out.println(map.get(i).getValue() + " = " + map.get(i).getKey());
    }
}

以下仅返回键,但我还需要值:

public String getByIndex(Map<String, Integer> map, int index)
{
    List<String> keys = new ArrayList<>(map.keySet());

    return (String) keys.get(index);
}

3 个答案:

答案 0 :(得分:3)

试试这个:

List<String> keys = new ArrayList(map.keySet());
for (int i = 0; i < keys.size(); i++)
{
    String key = keys.get(i);
    Integer value = map.get(key);
    //...
}

答案 1 :(得分:1)

你可以写一个方法来做到这一点。

public static <K, V> Map.Entry<K, V> getEntryByIndex(Map<K, V> map, int i) {
    if(i >= map.size()) {
        throw new IndexOutOfBoundsException(String.valueOf(i));
    }

    // use Iterator
    Iterator<Map.Entry<K, V>> it = map.entrySet().iterator();

    // skip to i
    for(; i > 0; --i) {
        it.next();
    }

    return it.next();
}

这几乎就像一个链表一样对待它。如果您发现这么做很多,您可能希望永久保留ArrayList和Map。

答案 2 :(得分:0)

可能的解决方法之一是将所有键也放入ArrayList,使用index可以访问它们。直接访问似乎不可能,因为keySet返回一个不支持索引访问的集合。