2012-05-07 3 views
1

Je voudrais savoir comment puis-je itérer dans un 2Dimensional HashMap? Je crée un objet TrueStringMap2D qui fait ce qui suit: Ce sera une carte 2D, je veux dire 2 clés et une valeur.iterator dans une carte 2Dimensional

Mais l'itérateur implémenté ici n'est pas fonctionnel .. je ne savais pas comment redéfinir la méthode Iterator dans TrueStringMap2D: S (si possible doit être retiré dans la fonction itérateur()) Quelqu'un peut-il aider? Merci beaucoup !!

+0

Quelqu'un pourrait aider s'il vous plaît? – ZelelB

+1

[Je ne pense pas que veut SO lire tout cela.] (Http://meta.stackexchange.com/a/129787/175248) Si vous pouvez rogner votre code pour s'adapter à la portée de votre question, que serait un énorme avantage. – Makoto

+0

Je voudrais redéfinir l'itérateur qui ira sur une carte contenant une carte endommagée. (Avec la classe Entrée que j'ai posté) – ZelelB

Répondre

3

Je vais réinterpréter la question dans quelque chose de similaire que vous aimez répondre, et je l'espère, la réponse à cette question est utile pour vous.

Voici la question que je vais répondre:

Comment puis-je écrire un itérateur qui parcourt toutes les valeurs dans un Map<String, Map<String, String>>?

Voici comment je le résoudre:

class TwoDimIterator implements Iterator<String> { 

    Iterator<Map<String, String>> outerIter; 
    Iterator<String> innerIter = Collections.<String>emptyList().iterator(); 

    public TwoDimIterator(Map<String, Map<String, String>> twoDimMap) { 
     outerIter = twoDimMap.values().iterator(); 
     advanceInner(); 
    } 

    @Override 
    public boolean hasNext() { 
     return innerIter.hasNext(); 
    } 

    @Override 
    public String next() { 
     String toReturn = innerIter.next(); 
     advanceInner(); 
     return toReturn; 
    } 

    private void advanceInner() { 
     while (!innerIter.hasNext()) { 
      if (!outerIter.hasNext()) { 
       innerIter = Collections.<String>emptyList().iterator(); 
       return; 
      } 
      innerIter = outerIter.next().values().iterator(); 
     } 
    } 

    @Override 
    public void remove() { 
     throw new UnsupportedOperationException(); 
    } 
} 

Code d'essai:

class Test { 

    public static void main(String[] args) { 

     // Create a map 
     Map<String, Map<String, String>> twoDimMap = 
       new HashMap<String, Map<String, String>>(); 

     // Fill it 
     Map<String, String> innerA = new HashMap<String, String>(); 
     innerA.put("1", "A1"); 
     innerA.put("2", "A2"); 

     Map<String, String> innerB = new HashMap<String, String>(); 
     innerB.put("1", "B1"); 
     innerB.put("2", "B2"); 

     twoDimMap.put("A", innerA); 
     twoDimMap.put("B", innerB); 

     // Create an iterator for the values: 
     Iterator<String> twoDimIter = new TwoDimIterator(twoDimMap); 
     while (twoDimIter.hasNext()) 
      System.out.println(twoDimIter.next()); 

    } 
} 

Sortie:

A2 
A1 
B2 
B1 
+0

Merci beaucoup pour votre réponse !! Mais c'est un devoir, et le professeur nous a dit que nous ne devrions pas utiliser de classes externes. Nous devrions simplement redéfinir cette méthode d'itérateur. Pouvez-vous l'adapter s'il vous plaît à mon TrueStringMap2D? C'est juste une méthode .. C'est pourquoi j'ai posté l'interface (qui contient la classe Entrée, que nous utiliserons juste pour la méthode d'itérateur) et mon TrueStringMap2D .. Pouvez-vous comprendre le code? C'est la dernière méthode que je devrais mettre en œuvre .. Merci !! – ZelelB

+0

Si c'est les devoirs, je pense que je vais laisser les étapes restantes à résoudre. :) – aioobe

+0

mais il ne retourne pas les 3 valeurs (key1, key2, value) de chaque entrée ... il ne renvoie que les valeurs ..: S – ZelelB