2012-02-15 5 views
2

Auparavant, j'ai créé une ArrayList pour contenir les objets des enregistrements. J'ai depuis remplacé le ArrayList avec un HashMap où les objets sont stockés et utilisent la chaîne de nom d'utilisateur d'un individu comme clé.Java - Itération sur HashMap en remplacement de ArrayList

La classe de ce répertoire a implémenté Iterable via implements Iterable<Object> (juste une question unique, mais pourquoi <Object> est-il requis?).

Le code précédent utilisé pour parcourir la ArrayList était:

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

J'ai ensuite utilisé cet itérateur pour tous les objets de cette classe comme suit:

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

Malheureusement, le HashMapName.iterable () semble soulever des problèmes, alors comment puis-je aller sur ce comportement avec un HashMap?

Répondre

0

Je résolu mon problème avec le remplacement records.iterator(); (qui ne fonctionne pas) avec records.values().iterator();. Il semble que vous ne pouvez pas itérer directement sur un HashMap, mais vous pouvez itérer sur les valeurs (objets) à l'intérieur.

En outre, la question de l'obtention et l'impression du contenu de la HashMap, j'ai résolu à travers le code suivant. Il itère sur les objets TelephoneRecords dans le répertoire, comme spécifié par TelephoneRecords o : directory et la méthode Iterator dans la classe de répertoire. Ensuite, un objet temporaire est assigné à l'objet TelephoneRecords en cours d'itération, et la méthode [custom] toString() est utilisée pour imprimer la chaîne de cet objet TelephoneRecords spécifique.

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

Et je fini par résoudre ma petite question de côté en suivant l'aide fournie, en utilisant Iterator<TelephoneRecords> (plutôt que d'utiliser simplement l'objet) pour itérer sur les objets TelephoneRecords contenus dans l'objet répertoire.

0

Qu'est-ce que "semble soulever des problèmes" signifie? Dans une HashMap, vous pouvez parcourir les clés (map.keySet()), les valeurs (map.values()) ou les paires valeur/clé (map.entrySet()).

0

Vous pouvez utiliser l'entryset de la hashmap, puis l'itérer de la même manière que vous le faites par ex.

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

}

En outre, si vous tapez votre hashmap il supprime la nécessité de la distribution -

Map<String, TelephoneRecords> 
5

Si vous n'êtes intéressé que par les clés, vous pouvez itérer à travers keySet() de la carte:

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

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

Si vous avez seulement besoin des valeurs, des valeurs d'utilisation():

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

Enfin, si vous voulez la clé et la valeur, utilisez entrySet():

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

espoir que cela vous aide.

1

Vous pouvez itérer sur l'ensemble entrySet de la HashMap. L'entrySet contient les ensembles de clés et de valeurs. Les clés et les valeurs sont ensuite accessibles via getKey() et getValue(). Cela peut être fait par le code suivant:

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

Votre hors question:

Object est un paramètre de type pour la HashMap, qui dit que le Iterable contient des objets.Si votre HashMap n'est censé contenir des objets TelephoneRecords, remplacer

implements Iterable<Object> 

avec

implements Iterable<TelephoneRecords> 

De cette façon, vous dites que votre Iterable contient TelephoneRecords, qui à son tour vous permet d'éviter la coulée et obtenez des erreurs de compilation au lieu d'erreurs d'exécution si vous faites quelque chose de mal (ce qui est préférable!). Cela améliorerait le code ci-dessus:

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

Pourquoi y a-t-il un problème avec mes records.iterator(); ? – mino

+0

Vous ne pouvez pas itérer directement sur HashMap, vous devez utiliser entrySet. Donc, si vous voulez créer un Iterator, essayez: Iterator > mapEntries = records.entrySet(). Iterator(); –