2010-08-09 4 views
7

ont mis en place un HashMap comme ceci:Comment puis-je extraire ArrayList à partir de HashMap et le boucler en Java? Je

Map<String, ArrayList<String>> theAccused = new HashMap<String, ArrayList<String>>(); 

... et je remplir en stockant pour chaque nom (clé), une liste de noms (valeur). Alors:

ArrayList<String> saAccused = new ArrayList<String>(); 
// populate 'saAccused' ArrayList 
... 
// done populating 
theAccused.put(sAccuser, saAccused); 

Alors maintenant, je veux regarder à travers toutes les entrées de la table de hachage et de voir si (pour chaque « sAccuser »), la liste « saAccused » contient un certain nom. Ceci est ma tentative a échoué jusqu'à présent:

Set<String> setAccusers = theAccused.keySet(); 
Iterator<String> iterAccusers = setAccusers.iterator(); 
iterAccusers.next(); 
ArrayList<String> saTheAccused; 

// check if 'sAccuser' has been accused by anyone before 
for (int i = 0; i < theAccused.size(); i++) { 
    saTheAccused = theAccused.get(iterAccusers); 

    if (saTheAccused.contains(sAccuser)) { 

    } 
    iterAccusers.next(); 
} 

... mais je ne sais pas comment les classes Set et Iterator travail:/Le problème est que je n'ai pas les « valeurs » ... la noms ... le 'sAccuser' s ... pour le HashMap disponible. En un mot, je veux parcourir la HashMap et vérifier si un nom spécifique est stocké dans l'une des listes. Alors, comment puis-je faire cela? Faites-moi savoir si vous avez besoin de moi pour approfondir les détails ou dissiper toute confusion.

Merci.

+1

+1 Sheesh! Un tas de réponses, mais pas l'un des répondeurs pris la peine de remettre en question la question? Un upvote signifie que la question est bien écrite, spécifique, et montre ce que l'utilisateur a déjà essayé. Cette question répond à toutes les exigences pour un upvote. –

+0

@Jim ... :) Merci! Wow ... ça fait vraiment plaisir d'avoir enfin quelqu'un qui me reconnaisse de cette façon. Merci beaucoup ... Je souhaite que d'autres personnes pensent comme vous :) Merci! +1 pour spécifier que ma question répond à toutes les exigences pour un upvote. – Hristo

+0

@ Jim Garrison vous avez raison, mais pour moi il y a deux autres exigences - la question devrait être difficile, et d'intérêt commun - c'est-à-dire quand vous avez le problème, googling devrait conduire à cette question. – Bozho

Répondre

4

En un mot, je veux parcourir la HashMap et vérifier si un nom spécifique est stocké dans l'une des listes. Alors, comment puis-je faire cela?

Il existe deux façons de parcourir la carte qui pourraient vous intéresser ici. Premièrement, vous pouvez parcourir tous les mappages (c'est-à-dire les paires de relations clé-valeur) en utilisant la méthode entrySet(), qui vous permettra de savoir quelle est la clé de chaque liste d'arrays. Sinon, si vous n'avez pas besoin de la clé, vous pouvez simplement obtenir toutes les listes à leur tour via la méthode values(). En utilisant la première option pourrait ressembler à ceci:

for (Map.Entry<String, ArrayList<String>> entry : theAccused.entrySet()) 
{ 
    String sListName = entry.getKey(); 
    ArrayList<String> saAccused = entry.getValue(); 
    if (saAccused.contains(sAccuser)) 
    { 
     // Fire your logic for when you find a match, which can 
     // depend on the list's key (name) as well 
    } 
} 

Pour répondre aux questions plus larges - l'interface Set représente simplement une (non numérotée) collection de valeurs non-double. Comme vous pouvez le voir par le Javadoc lié, il existe des méthodes disponibles que vous pourriez attendre pour une telle collection non ordonnée. Un Iterator est un objet qui traverse une structure de données présentant successivement chaque élément.L'utilisation typique d'un itérateur ressemblerait à quelque chose comme ce qui suit:

Iterator<?> it = ...; // get the iterator somehow; often by calling iterator() on a Collection 
while (it.hasNext()) 
{ 
    Object obj = it.next(); 
    // Do something with the obj 
} 

qui est, vérifier si l'itérateur est nonexhausted (a plus d'éléments), puis appeler la méthode next() pour obtenir cet élément. Cependant, puisque le modèle ci-dessus est si commun, il peut être élidé avec foreach loop de Java 5, vous épargnant de traiter avec l'itérateur lui-même, comme j'en ai profité dans mon premier exemple.

+0

Wow ... Merci pour cette réponse! Question rapide ... quand vous dites 'Iterater it = ...;', est-il égal à un élément, dans mon cas, est-il égal à un élément de l'ensemble? Merci pour le lien vers 'for-each'. Je ne l'ai jamais utilisé. Réponse stellaire! – Hristo

+0

Aussi ... si nous revenons à votre boucle for ... si je trouve une correspondance, comment puis-je extraire le nom (clé) de la ArrayList qui contient 'sAccuser'? – Hristo

+1

@Hristo - la variable 'it' serait un objet qui retournerait les éléments successifs de la collection sous-jacente chaque fois que sa méthode' next() 'a été appelée, et non un élément lui-même. En ce qui concerne votre deuxième question, j'ai modifié mon exemple pour l'afficher en utilisant 'entrySet()', car c'est le moyen d'itérer sur une carte quand vous vous souciez à la fois des clés * et * des valeurs. –

0

Vous devez utiliser la valeur de Iterator.next() pour indexer dans Map.

String key = iterAccusers.next(); 
saTheAccused = theAccused.get(key); 

Actuellement vous obtenez des valeurs de la Map basées sur la iterator, pas les valeurs renvoyées par la iterator.

3

Quelque chose comme ça?

for (List<String> list : theAccused.values()) { 
    if (list.contains("somename")) { 
     // found somename 
    } 
} 
2

Cela devrait le faire fonctionner:

saTheAccused = theAccused.get(iterAccused.next()); 

Cependant, pour rendre plus lisible votre code, vous pouvez soit:

for (List<String> values : theAccused.values()) { 
    if (value.contains(sAcuser)) { 
     .. 
    } 
} 

ou, si vous avez besoin de la clé:

for (String key : theAccused.keySet()) { 
    List<String> accused = theAccused.get(key); 
    if (accused.contains(sAccuser)) { 
    } 
} 
+0

Merci. C'est ce dont j'avais besoin. Réviser votre réponse si ... Je cherchais un ArrayList ... Je ne veux pas que vous soyez downvoted pour une raison stupide :) – Hristo

+0

@Hristo vous obtenez un 'ArrayList', mais vous le référencez par son interface -' List', ce qui est considéré comme une meilleure pratique (sauf si vous avez vraiment besoin des méthodes spécifiques à 'ArrayList') – Bozho

+2

Si vous avez besoin de la clé et de la valeur, vous devez utiliser entrySet, plutôt que keySet et get. – ILMTitan

0

Faire une méthode qui le fait:

private String findListWithKeyword(Map<String, ArrayList<String>> map, String keyword) { 
    Iterator<String> iterAccusers = map.keySet().iterator(); 
    while(iterAccusers.hasNext()) { 
     String key = iterAccusers.next(); 
     ArrayList<String> list = theAccused.get(key); 
     if (list.contains(keyword)) { 
     return key; 
     } 
    } 
} 

Et quand vous appelez la méthode:

String key = findListWithKeyword(map, "foobar"); 
ArrayList<String> theCorrectList = map.get(key); 
+0

.. merci pour votre réponse. J'écris déjà une méthode qui le fait. C'est le point de ma question :) Question rapide ... quand vous dites 'Iterater iterAccusers = ...;', est iterAccusers égal à un élément, dans mon cas, est-il égal à un élément de l'ensemble, ou est-il non initialisé pour commencer? – Hristo

+0

Aussi, une question de plus ... si je trouve une correspondance, comment puis-je extraire le nom (clé) de ArrayList qui contient 'sAccuser' auquel il appartient? – Hristo

+0

iterAccusers est un Iterator, c'est-à-dire que vous pouvez appeler next() et obtenir l'élément suivant. C'est comme une boucle pour chaque. L'itérateur n'est PAS un élément de l'ensemble, c'est un objet utilisé pour parcourir l'ensemble. Pour l'extraction de la clé. Au lieu de retourner la liste, il suffit de retourner la clé. Voir le code édité. – Jes

0

Il semble que vous devez faire deux choses: d'abord, savoir si un nom donné est "accusé", et deuxièmement, découvrez qui est l'accusateur. Pour cela, vous devez parcourir les objets Entrée dans votre carte.

for (Entry<String, List<String>> entry : theAccused.entrySet()) { 
     if (entry.getValue().contains(accused)) { 
      return entry.getKey(); 
     } 
    } 

    return null; // Or throw NullPointerException, or whatever. 

Dans cette boucle, l'objet Entrée contient un seul mappage de valeurs de clé. Donc entry.getValue() contient la liste des accusés, et entry.getKey() contient leur accusateur.

+0

.. qu'est-ce qu'un objet Entrée? Je n'ai pas encore rencontré ça. – Hristo

+0

C'est en fait une classe interne de carte. Le nom complet de la classe est java.util.Map.Entry. (Le JavaDoc est ici: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Map.Entry.html) D'après mon expérience, il est rarement utilisé. Cependant, dans ce cas, cela fonctionne bien, et comme il fait partie de l'API Map, il n'y a aucune raison de ne pas l'utiliser. – DeathB4Decaf

Questions connexes