Сумасшедшее поведение Java HashMap с дублирующимися ключами

1

Это действительно странно. Вот мой код:

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? Это пользовательский класс, который вы написали? Можете ли вы включить его код?
  • 0
    Это из org.apache.hadoop.io.Text Hadoop
Показать ещё 9 комментариев
Теги:
dictionary
hashmap

1 ответ

2
Лучший ответ

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

Короче говоря: я думаю, проблема в том, что ваш итератор постоянно возвращает объект SAME.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню