2012-02-15 3 views
2

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

Класс этого каталога реализован 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?

ответ

0

я решил свою проблему с заменой 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

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

0

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

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

}

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

Map<String, TelephoneRecords> 
5

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

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

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

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

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

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

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

Надеется, что это помогает вам.

1

Вы можете выполнить итерацию над entrySet HashMap. В EntrySet содержатся наборы ключей и значений. Затем ключи и значения доступны через 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 ... 
} 

Ваш вне вопрос:

Объект является параметром типа для HashMap, в котором говорится, что Iterable содержит объекты.Если ваш 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

Итак, почему возникает проблема с моими record.iterator(); ? – mino

+0

Вы не можете напрямую перебирать HashMap, вы должны использовать entrySet. Поэтому, если вы хотите создать Iterator try: Iterator > mapEntries = records.entrySet(). Iterator(); –

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