Java - итерация по HashMap, заменяющая ArrayList - PullRequest
2 голосов
/ 16 февраля 2012

Ранее я настроил ArrayList для содержания объектов записей.С тех пор я заменил ArrayList на HashMap, в котором хранятся объекты, и использовал в качестве ключа строку имени пользователя для индивидуума.

Класс этого каталога реализован с помощью Iterable через implements Iterable<Object> (только один вопрос,но почему <Object> требуется?).

Предыдущий код, используемый для перебора ArrayList, был:

    public Iterator iterator() {
        return records.iterator();
    }

Затем я использовал этот итератор для всех объектов этого класса следующим образом:

   for (Object o : directory) { 
            TelephoneRecords temp = (TelephoneRecords) o;
            System.out.println(temp.toString());
    }

К сожалению, HashMapName.iterable ();Кажется, возникают проблемы, так как мне поступить с таким поведением с помощью HashMap?

Ответы [ 5 ]

5 голосов
/ 16 февраля 2012

Если вас интересуют только ключи, вы можете перебрать keySet () карты:

Map<String, Object> map = ...;

for (String key : map.keySet()) {
    // ...
}

Если вам нужны только значения, используйте values ​​():

for (Object value : map.values()) {
    // ...
}

Наконец, если вам нужны ключ и значение, используйте entrySet ():

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}

Надеюсь, это вам поможет.

1 голос
/ 16 февраля 2012

Вы можете перебирать набор записей HashMap. Набор записей содержит наборы ключей и значений. Ключи и значения затем доступны через getKey () и getValue (). Это можно сделать с помощью следующего кода:

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String username = entry.getKey();
    TelephoneRecord record = (TelephoneRecord)entry.getValue();
    // Do something with username and record ...
}

Ваш дополнительный вопрос:

Object - это параметр типа для HashMap, который говорит, что Iterable содержит Objects. Если ваш HashMap должен содержать только объекты TelephoneRecords, замените

implements Iterable<Object>

с

implements Iterable<TelephoneRecords>

Таким образом, вы говорите, что ваш Iterable содержит TelephoneRecords, что, в свою очередь, позволяет вам избегать приведения и получать ошибки компиляции вместо ошибок времени выполнения, если вы делаете что-то не так (что предпочтительно!). Это улучшит приведенный выше код до:

for (Map.Entry<String, TelephoneRecord> entry : map.entrySet()) {
    String username = entry.getKey();
    TelephoneRecord record = entry.getValue();
    // Do something with username and record ...
}
0 голосов
/ 16 февраля 2012

Я решил проблему с заменой records.iterator(); (которая не работала) на records.values().iterator();. Кажется, вы не можете выполнять итерацию непосредственно по HashMap, но вы можете выполнять итерации по значениям (объектам) внутри него.

Кроме того, проблему получения и печати содержимого HashMap я решил с помощью следующего кода. Он перебирает объекты TelephoneRecords в каталоге, как указано TelephoneRecords o : directory, и метод Iterator в классе каталога. Затем временный объект назначается объекту TelephoneRecords, по которому выполняется итерация, и метод [custom] toString (), используемый для распечатки строки этого конкретного объекта TelephoneRecords.

for (TelephoneRecords o : directory) { 
    TelephoneRecords temp = (TelephoneRecords) o;
    System.out.println(temp.toString());
}

И я решил решить свой маленький побочный вопрос, следуя предоставленной справке, используя Iterator<TelephoneRecords> (а не просто используя Object) для перебора объектов TelephoneRecords, содержащихся в объекте каталога.

0 голосов
/ 16 февраля 2012

Вы можете использовать набор записей из хэш-карты, а затем выполнить итерацию по нему так же, как вы уже, например,

for (Object o : Directory.getEntrySet()) {

}

Кроме того, если вы напечатаете хэш-карту, это устранит необходимость в приведении -

Map<String, TelephoneRecords>
0 голосов
/ 16 февраля 2012

Что означает "кажется, что возникают проблемы" означает? В HashMap вы можете перебирать ключи (map.keySet()), значения (map.values()) или пары ключ-значение (map.entrySet()).

...