[hashmap] [iterator] дает половинные значения - PullRequest
0 голосов
/ 17 мая 2018

Я писал простую итерационную программу HashMap и столкнулся со следующей проблемой:

HashMap<String, Integer> hm1 = new HashMap<String, Integer>();
hm2.put("One", 1);
hm2.put("Two", 2);
hm2.put("Three", 3);
hm2.put("Four", 4);
hm2.put("Five", 5);
hm2.put("Six", 6);


Set<String> keySet = hm2.keySet();
Iterator<String> itr = keySet.iterator();

while(itr.hasNext())
{
    String key = itr.next();
    System.out.println("Key: " + key + "Values:" + hm2.get(itr.next()));
}

Вопрос - hm2.get(itr.next()) дает только 3 значения в выводе, в то время как если я использую hm2.get (ключ), то он перечисляет все 6 значений. Почему это так?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Вы продвигаете итератор (вызывая next()) дважды внутри цикла, и таким образом «пропускаете» половину значений.Вы должны звонить next() только один раз за каждый проверочный hasNext().В этом случае, просто используйте вашу локальную переменную key:

Set<String> keySet = hm2.keySet();
Iterator<String> itr = keySet.iterator();
while(itr.hasNext())
{
    String key = itr.next();
    System.out.println("Key: " + key + "Values:" + hm2.get(key));
}

Обратите внимание, что вы можете просто перебрать entrySet() вместо перебора keySet() и затем получитьзначение для каждой клавиши:

Set<Map.Entry<String, Integer>> entrySet = hm2.entrySet();
Iterator<Map.Entry<String, Integer>> itr = entrySet.iterator();
while(itr.hasNext())
{
    Map.Entry<String, Integer> entry = itr.next();
    System.out.println("Key: " + entry.getKey() + "Values:" + entry.getValue());
}

Или, что еще более элегантно, с расширенным циклом for:

for (Map.Entry<String, Integer> entry : hm2.entrySet()) 
{
    System.out.println("Key: " + entry.getKey() + "Values:" + entry.getValue());
}
0 голосов
/ 17 мая 2018

Я бы порекомендовал вам использовать Map.Entry Interface для итерации Map.

    HashMap<String, Integer> hm2 = new HashMap<String, Integer>();
    hm2.put("One", 1);
    hm2.put("Two", 2);
    hm2.put("Three", 3);
    hm2.put("Four", 4);
    hm2.put("Five", 5);
    hm2.put("Six", 6);


    for(Map.Entry<String, Integer> e: hm2.entrySet()) {
        System.out.println("Key: " + e.getKey() + " Values:" + e.getValue());
    }
0 голосов
/ 17 мая 2018

Это потому, что когда вы делаете это itr.next(), итератор продвигается на один шаг вперед и возвращает значение. Таким образом, вы получаете только 3 значения, когда вы вызываете itr.next() дважды за одну итерацию, и получаете все шесть значений, когда вы вызываете его только один раз. Поэтому, если у вас все шесть значений, вы должны использовать hm2.get(key).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...