Java - получить индекс ключа в HashMap? - PullRequest
40 голосов
/ 21 апреля 2010

В Java, если я зацикливаюсь на keySet() из HashMap, как мне (внутри цикла) получить числовой индекс этого ключа?

В основном, когда я зацикливаюсь накарта, я хочу иметь возможность получить 0,1,2 ... Я полагаю, что это будет чище, чем объявление int и увеличение с каждой итерацией.

Спасибо.

Ответы [ 8 ]

47 голосов
/ 11 апреля 2011

Используйте LinkedHashMap вместо HashMap Он всегда будет возвращать ключи в том же порядке (как вставка) при вызове keySet ()

Подробнее см. Класс LinkedHashMap

42 голосов
/ 21 апреля 2010

Не уверен, что это какой-то "чище", но:

List keys = new ArrayList(map.keySet());
for (int i = 0; i < keys.size(); i++) {
    Object obj = keys.get(i);
    // do stuff here
}
21 голосов
/ 21 апреля 2010

HashMap не имеет определенного порядка ключей.

11 голосов
/ 22 апреля 2010

Если все, что вы пытаетесь сделать, это получить значение из самого hashmap, вы можете сделать что-то вроде следующего:

for (Object key : map.keySet()) {
    Object value = map.get(key);
    //TODO: this
}

Или вы можете перебирать записи на карте, если это то, что вас интересует:

for (Map.Entry<Object, Object> entry : map.entrySet()) {
    Object key = entry.getKey();
    Object value = entry.getValue();
    //TODO: other cool stuff
}

Как сообщество, мы могли бы дать вам лучшие / более подходящие ответы, если бы у нас была идея, зачем вам нужны индексы или что, по вашему мнению, индексы могут сделать для вас.

9 голосов
/ 21 апреля 2010

Вы не можете - набор неупорядочен, поэтому индекс не указан. Вы должны будете объявить int, как вы говорите. Просто помните, что в следующий раз, когда вы вызовете keySet (), вы не обязательно получите результаты в том же порядке.

5 голосов
/ 21 апреля 2010

Проще говоря, коллекции на основе хеша не индексируются, поэтому вам придется делать это вручную.

4 голосов
/ 17 февраля 2014

Я недавно изучал концепции, лежащие в основе Hashmap, и было ясно, что не было определенного порядка ключей. Для итерации вы можете использовать:

Hashmap<String,Integer> hs=new Hashmap();
for(Map.Entry<String, Integer> entry : hs.entrySet()){
      String key=entry.getKey();
      int val=entry.getValue();
      //your code block  
  }
3 голосов
/ 01 декабря 2015

Публикация этого в качестве не менее жизнеспособной альтернативы ответу @Binil Thomas - пытался добавить его в качестве комментария, но не был убежден в удобочитаемости всего этого.

int index = 0;

for (Object key : map.keySet()) {
   Object value = map.get(key);
   ++index;
}

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

...