Это действительно странно. Вот мой код:Java HashMap сумасшедшее поведение с дублирующимися ключами
Map<Text,Integer> frequencies = new HashMap<Text,Integer>();
Text currentBrowser = new Text();
// update map with browser frequencies
while(values.hasNext()){
currentBrowser = values.next();
if (frequencies.containsKey(currentBrowser))
frequencies.put(currentBrowser, frequencies.get(currentBrowser) + 1);
else
frequencies.put(currentBrowser, new Integer(1));
}
Идея заключается в том, что values
является Iterator<Text>
, и содержит список браузеров (Chrome, IE и т.д.). Я просто хочу создать карту, которая будет хранить частоту каждого браузера (если Chrome появляется 3 раза в списке - я хочу, чтобы его значение было 3 и т. Д.)
Проблема в том, что это не работает. Когда я отлаживаю его шаг за шагом, вот что происходит: Первый браузер - Explorer, и он правильно помещает его на карту: {Explorer=1}
. Далее идет Safari, поэтому он идет в else
, но вот что происходит с картой: {Safari=1, Safari=1}
! Следующие два браузера - Safari, и они вставляются соответствующим образом: {Safari=1, Safari=3}
, но затем идет Firefox, и вот что происходит: {Firefox=1, Firefox=1, Firefox=3}
. Таким образом, вы можете видеть, что каждый раз, когда в карту вставляется новый ключ, он также меняет все остальные клавиши. Первый Firefox должен быть Explorer, второй должен быть Firefox, а третьим должен быть Safari.
Что здесь происходит?
Что такое класс Text? Это пользовательский класс, который вы написали? Можете ли вы включить его код? – Eran
Это из Hadoop's org.apache.hadoop.io.Text – Cauthon
Как вы создаете 'Iterable'? Пожалуйста, разместите все соответствующие коды –