Подтвердить что ты не робот

Java - получить индекс ключа в HashMap?

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

Не уверен, что это "очиститель", но:

List keys = new ArrayList(map.keySet());
for (int i = 0; i < keys.size(); i++) {
    Object obj = keys.get(i);
    // do stuff here
}

Ответ 3

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

Ответ 4

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

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
}

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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  
  }

Ответ 8

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

int index = 0;

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

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