Коллекции Java - keyset() против entrySet() на карте
Я поместил элементы массива строк - это карта, где элементы массива строк - это ключ, а частота слова - это значение, например:
String[] args = {"if","it","is","to","be","it","is","up","me","to","delegate"};
тогда на карте будут записи типа [ if:1, it:2 .... ]
Set<String> keys = m.keySet();
System.out.println("keyset of the map : "+keys);
печатает все ключи: "if","it","is","to","be","it","is","up","me","to","delegate"
Set<Map.Entry<String, Integer>> entrySet = m.entrySet();
Iterator<Map.Entry<String, Integer>> i = entrySet.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> element = i.next();
System.out.println("Key: "+element.getKey()+" ,value: "+element.getValue());
}
печатает все пары значений ключа:
При использовании набора записей распечатываются все значения:
Key: if ,value: 1
Key: it ,value: 2
Key: is ,value: 2
Key: to ,value: 2
Key: be ,value: 1
Key: up ,value: 1
Key: me ,value: 1
Key: delegate ,value: 1
Но блок кода ниже должен выводить точно такой же вывод, как и выше, но это не так:
Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
//System.out.println(itr1.next()+" ");
//System.out.println(m.get(itr1.next())+" ");
System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
}
Это печатает:
Key: if ,value: 2
Key: is ,value: 2
Key: be ,value: 1
Key: me ,value: 1
Но если мы раскомментируем строку 1 в цикле while, т.е.
System.out.println(itr1.next()+" ");
и прокомментируйте строку
System.out.println("Key: "+itr2.next()+" ,value: "+m.get(itr2.next()));
Тогда мы получаем все ключи: {"if","it","is","to","be","it","is","up","me","to","delegate"};
Если мы используем m.get()
с itr2.next()
то итератор не имеет мало ключей!
5 ответов
Каждый звонок в Iterator.next()
перемещает итератор к следующему элементу. Если вы хотите использовать текущий элемент в более чем одном выражении или выражении, вы должны сохранить его в локальной переменной. Или даже лучше, почему бы вам просто не использовать цикл for-each?
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
Более того, цикл по entrySet выполняется быстрее, потому что вы не запрашиваете карту дважды для каждого ключа. Также Map.Entry
реализации обычно реализуют toString()
метод, так что вам не нужно печатать пару ключ-значение вручную.
for (Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry);
}
Обход по большой карте entrySet()
намного лучше чем keySet()
, Посмотрите в этом уроке, как они оптимизируют обход большого объекта с помощью entrySet(
) и как это помогает для настройки производительности.
Каждый раз, когда вы вызываете itr2.next(), вы получаете отдельное значение. Не то же значение. Вы должны вызывать это только один раз в цикле.
Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
String v = itr2.next();
System.out.println("Key: "+v+" ,value: "+m.get(v));
}
Iterator
двигается только вперед, если он прочитал это один раз, это сделано. Ваш
m.get(itr2.next());
читает следующее значение itr2.next();
Вот почему вы упускаете несколько (на самом деле не несколько, все остальные) ключей.
Здравствуйте, @NINCOMPOOP, чтобы упростить задачу. Обратите внимание, что каждый раз, когда вы выполняете itr2.next (), указатель перемещается к следующему элементу, т. Е. Здесь, если вы внимательно обратите внимание, вывод будет в порядке в соответствии с написанной вами логикой.
Это может помочь вам лучше понять:
1-я итерация цикла While (указатель находится перед 1-м элементом): Key: if,value: 2 // averageitr2.next()=if; m.get(itr2.next()= это) => 2}
2-я итерация цикла While (указатель находится перед 3-м элементом): Key: is,value: 2 // averageitr2.next()=is; m.get(itr2.next()= в) => 2}
3-я итерация цикла While (указатель находится перед 5-м элементом): Key: be,value: 1 // averageitr2.next()="be"; m.get(itr2.next()="вверх")=>"1"}
Четвёртая итерация цикла While (указатель находится перед седьмым элементом): Key: me,value: 1 // averageitr2.next()="me"; m.get(itr2.next()="делегат")=>"1"}
Ключ: если, значение: 1 Ключ: это, значение: 2 Ключ: есть, значение: 2 Ключ: до, значение: 2 Ключ: быть, значение: 1 Ключ: вверх, значение: 1 Ключ: я, значение: 1 Ключ: делегат, значение: 1
Это печатает:
Ключ: если, значение: 2
Ключ: есть, значение: 2 Ключ: быть, значение: 1 Ключ: я, значение: 1