коллекции java-keyset () vs 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 i.e
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);
}
каждый раз, когда вы вызываете itr2.next () вы получаете отличное значение. Не то же самое значение. Вы должны позвонить только один раз в цикле.
Iterator<String> itr2 = keys.iterator();
while(itr2.hasNext()){
String v = itr2.next();
System.out.println("Key: "+v+" ,value: "+m.get(v));
}
обход по большой карте entrySet()
намного лучше, чем keySet()
. Проверка этой учебник, как они оптимизируют обход большого объекта с помощью entrySet(
) и как он помогает для настройки производительности.
An Iterator
движется только вперед, если он читал его один раз, это делается. Ваш
m.get(itr2.next());
Читать далее значение itr2.next();
, вот почему вам не хватает нескольких (На самом деле не нескольких, а всех остальных) ключей.
Привет @NINCOMPOOP чтобы сделать вещи простыми, обратите внимание, что каждый раз, когда вы делаете itr2.next () указатель перемещается к следующему элементу,т. е. здесь, Если вы внимательно заметите, то вывод будет отлично соответствовать написанной вами логике .
Это может помочь вам лучше понимать:
1-я итерация цикла While (указатель находится перед 1-м элементом): Ключ: if, значение: 2 / / {itr2.next ()=if; m.get (itr2.next ()=it)=>2}
2-я итерация While loop (указатель находится перед 3-м элементом): Ключ: is, значение: 2 / / {itr2.next ()=is; m.get (itr2.next ()=to)=>2}
3-я итерация цикла While (указатель находится перед 5-м элементом): Ключ: be, значение: 1 / / {itr2.next ()= "be"; m.get (itr2.next ()= "вверх")=>"1"}
4-я итерация цикла While (указатель находится перед 7-м элементом): Ключ: me, значение: 1 / / {itr2.next ()="me"; m.get (itr2.next ()="делегат")=>"1"}
ключ: если, значение: 1 Ключ: it, значение: 2 Ключ: is, значение: 2 Ключ: значение: Два Ключ: be, значение: 1 Ключ: вверх, значение: 1 Ключ: me, значение: 1 Ключ: делегат, значение: 1
он печатает:
ключ: если, значение: 2
Ключ: is, значение: 2
Ключ: be, значение: 1
Ключ: me, значение: 1