2014-11-05 2 views
0

Есть ли способ итерации 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); 
} 
+1

дубликат дубликата по http://stackoverflow.com/questions/13581997/how-get-value-from-linkedhashmap-based-on-index-not-on-key –

+0

'LinkedHashMap' сохраняет порядок вставки, так что итерация по своим значениям() ', используя усиленный цикл, должна дать вам элементы в том же порядке, который вы их поместили. Если вам нужен счетчик, просто определите его в цикле for, увеличив его внутри. – A4L

+0

Вам нужны индексы во время обработки записей, или вам нужен произвольный доступ? Если первый, вы можете создать класс Pair и поток значений 'Pair >, а затем вам не нужно будет создавать полную параллельную копию. Если последний, повторите «entrySet()» и поместите значения в 'ArrayList >'. –

ответ

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 вместе с Картой.

0

Одним из возможных способов решения было бы поместить все ключи и в ArrayList, где их можно получить с помощью индекса. Прямой доступ кажется невозможным, потому что keySet возвращает набор, который не поддерживает индексированный доступ.

+0

Я пробовал это раньше, но он только вернул «ключи» с карты, но мне также нужны «значения». – BullyWiiPlaza

+0

Поместите ключи, а не значения в ArrayList. Вы можете получить значение, когда это необходимо, непосредственно с карты, используя ключ. – h22

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); 
    //... 
} 
Смежные вопросы