2009-11-14 5 views
0

J'ai des problèmes pour créer une boucle for dans un constructeur pour itérer sur une carte et une matrice en même temps. Here, il est indiqué que cela ne peut pas être fait avec une boucle for enhanced.Itérer sur une carte et une matrice simultanément dans une boucle for

J'ai quelque chose comme ceci, qui soulève une erreur de compilateur. Fondamentalement, la classe a une carte que je veux remplir via le constructeur qui prend une collection et un nombre variable d'entiers comme paramètres. L'expression var-arg évalue à un tableau d'entiers, donc j'ai essayé de mettre les deux itérateurs améliorés dans la même boucle, mais ne fonctionnait pas.

private final Map<Module, Integer> modules = new HashMap<Module, Integer>();  
    AssemblyType(Collection<Module> modules, int... units) { 
     int i = 0; 
     for (Module module : modules, int i : units) { 
      this.modules.put(module, units[i]); 
     }  
    } 

Merci pour vos idées sur la façon de procéder.

+0

L'opérateur && travaille-t-il à l'intérieur de la boucle for? –

Répondre

2

La façon naïve de le faire serait juste pour suivre vous i:

private final Map modules = new HashMap();  
    AssemblyType(Collection modules, int... units) { 
     int i = 0; 
     for (Module module : modules) { 
       this.modules.put(ingredient, units[i]); 
       i++; 
     }    
    }

Je ne sais pas s'il y a une meilleure façon, mais je suis sûr que vous ne pouvez pas combiner deux itérateurs à l'intérieur une seule boucle for comme votre exemple original.

+0

Le moyen le plus simple est généralement le meilleur. Cela fonctionne également dans ce cas car les arguments var ont la même longueur que la collection! Merci – denchr

0

Il semble que vous essayiez de passer un des modules Map comme Collection ce qui provoquerait une erreur de compilation.

Code pour itérer sur deux pourrait être quelque chose comme ça

public MyMethod(Map<Object, Object> objectMap, Integer ... intArray) { 
    if(intArray.length != ObjectMap.size()) { 
     //However you want to handle this case 
    } 
    Iterator<Object> mapKeyIterator = objectMap.keySet().iterator(); 
    Iterator<Integer> integerIterator = Arrays.asList(intArray).iterator(); 

    while(mapKeyIterator.hasNext()) { //If the array and map are the same size then you only need to check for one. Otherwise you'll need to validate both iterators have a next 
     Object keyFromMap = mapKeyIterator.next(); 
     Object valueFromMap = objectMap.get(keyFromMap); 
     Integer intFromArray = integerIterator.next(); 
     //Whatever you want to do 
    } 
} 

Si vous savez qu'ils sont de la même longueur, vous pouvez aussi traverser le tableau avec une boucle for(int i ... et il suffit d'utiliser un itérateur pour la carte si vous Je ne voulais pas créer une liste.

0

Cela ressemble à une API très sujette aux erreurs, pour demander une carte et un tableau complètement déconnectés. Non seulement sujettes aux erreurs, mais il sera difficile pour les lecteurs du code de savoir quel int va avec quelle entrée de la carte. Je conseille toujours contre ce genre d'API. Essayez une carte < Object, MySpecialType > où MySpecialType agrège à la fois un objet et un int.

+0

Oui, il pourrait être un peu risqué. Pourriez-vous donner un petit exemple de l'approche que vous suggérez – denchr

+0

c'est difficile quand le problème est énoncé dans des termes aussi vagues; Si vous pouviez le rendre plus concret, cela aiderait. (note: ma réponse ici est légèrement plus facile à comprendre maintenant que je suis retourné et échappé correctement les équerres - aughghghg.) –

Questions connexes