Создание пользовательского итератора для HashMap - PullRequest
4 голосов
/ 05 марта 2011

Я пытаюсь реализовать итератор, который будет перебирать HashMap и его дубликаты.Например,

string.put("a", 1);
string.put("a", 2);
string.put("b", 3);
string.put("b", 4);

Однако с моим итератором я выполняю итерацию только дважды, один раз для значения «a», а другой для «b».Я хотел бы сделать итератор, который будет повторяться 4 раза по всей карте.

РЕДАКТИРОВАТЬ: Я как бы пропустил много деталей, потому что я просто хотел посмотреть, возможен ли этот итератор, но кодЯ пишу на самом деле абстракция карты.Например, у меня есть функция add, которая принимает параметр T. Поэтому для добавления строки это будет выглядеть как add («Hello»).Добавляя эту строку, ее ключ равен «String», а его значение равно 1. Если я снова вызываю add («Hello»), оно увеличивает значение до 2. Если я добавляю его снова, оно увеличивает его значение до 3.и так далее.Я хочу создать итератор, который будет перебирать все, что я добавил.

Ответы [ 3 ]

4 голосов
/ 05 марта 2011

К сожалению, интерфейс Java Map не допускает дублирование ключей:

Объект, который сопоставляет ключи со значениями. карта не может содержать дубликаты ключей; каждая клавиша может отображать не более одного значения.

Таким образом, когда вы пытаетесь поместить ключ, который уже существует на карте, новое значение заменяет старое значение; причина, по которой ваш итератор повторяется 2 раза, состоит в том, что есть только 2 элемента.

Если вы хотите сохранить дублирующиеся ключи (например, «a», указывающие на 1 и 2), вы можете иметь карту списка или набор, например,

Map<String, List<Integer>> myMap;

Где список или набор, который соответствует ключу, содержит все значения, например myMap.get("a"), возвращает список, который будет выглядеть как [1,2].

Или используйте что-то вроде MultiMap из Google или Apache


Для вашей проблемы, я полагаю, вы говорите, что вам нужна специальная карта, где:

  1. Значение для каждой клавиши - сколько раз она была введена.
  2. Когда вы перебираете карту, вы перебираете все добавленные ключи, каждый раз, когда они добавляются.

Возможно, вы захотите взглянуть на то, как они реализовали iterator() для HashMap , особенно на внутреннем закрытом классе HashIterator.

next() и hasNext() могут, возможно, продолжать возвращать ключ столько раз, сколько указано значением (т. Е. Если "Hello" отображается на 2, ваш пользовательский итератор () вернется с next() "Hello "два раза, прежде чем перейти к следующему ключу).

Карта может не подходить для того, что вы пытаетесь сделать, но я желаю вам удачи!

3 голосов
/ 05 марта 2011

Вы можете попробовать использовать Multimap из библиотеки guava. java.util.HashMap позволяет связать только одно значение с одним ключом.

0 голосов
/ 05 марта 2011

Вы можете получить доступ к Итератору для вашей HashMap следующим образом:

myHashMap.entrySet.iterator()

Если вы хотите зациклить все свои объекты, это более быстрый способ:

for(Object o : myHashMap.entrySet()) {
     // do something with o
}

Проблема в вашем случае, похоже, связана с тем, что HashMap в java не может иметь идентичные ключи, поэтому ваш код добавляет только два объекта в HashMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...