Это действительно странно. Вот мой код:
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.
Что здесь происходит?
Из вашего описания, похоже, ваша проблема в том, что объект currentBrowser фактически не меняется. Значение: вы добавляете объект SAME во время каждой итерации; в дополнение к этому вы изменяете внутреннее представление этого объекта.
Короче говоря: я думаю, проблема в том, что ваш итератор постоянно возвращает объект SAME.