2015-03-23 3 views
1

Это действительно странно. Вот мой код: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.

Что здесь происходит?

+1

Что такое класс Text? Это пользовательский класс, который вы написали? Можете ли вы включить его код? – Eran

+0

Это из Hadoop's org.apache.hadoop.io.Text – Cauthon

+1

Как вы создаете 'Iterable '? Пожалуйста, разместите все соответствующие коды –

ответ

2

Из вашего описания, похоже, ваша проблема в том, что объект currentBrowser фактически не меняется. Значение: вы добавляете объект SAME во время каждой итерации; в дополнение к этому вы изменяете внутреннее представление этого объекта.

Краткая история: Я думаю, проблема в том, что ваш итератор постоянно возвращает ТО ЖЕСТОЙ объект.

Смежные вопросы