10
votes

Comment fonctionne un pour chaque boucle?

Comment une boucle pour chaque fonctionne-t-elle lorsqu'elle appelle une méthode, soit une méthode de récursivement, soit une méthode différente?

Exemple: P>

for(String permutation : permute(remaining))
    {   

      // Concatenate the first character with the permutations of the remaining chars
      set.add(chars.charAt(i) + permutation);
    }


4 commentaires

Pourquoi ne le codez-vous pas et ne vous sentez-vous pas dans un débogueur, comme Eclipse?


Cela n'a rien à voir avec la récursion, comme posé.


Ou utilisez Javap pour désassembler!


+1 pour essayer de comprendre ce qui semble fortement être vos devoirs.


5 Réponses :


1
votes

foreach boucle fonctionne sur n'importe quelle classe qui implémente l'interface hasnext () et suivant () suivant sur un itérateur . Même thread de même boucle et la fonction est appelée une fois.


1 commentaires

Merci pour votre réponse. :)



3
votes

L'appelle une fois, stocke le résultat, prévoit-il.

Comme ceci: xxx

EDIT: Si cela est récursif, cela ne fait aucune différence. Chaque couche de récursivité a simplement sa propre portée, et donc sa propre variable "TEMP". Ainsi, la fonction de permutation recueille au niveau le plus bas, puis chaque niveau supérieur fera son complètement séparé de la boucle successivement.


1 commentaires

@ user1965283 Pas de problème, mais n'oubliez pas d'accepter votre réponse préférée (qui devrait être Ulmangt, comme sa réponse est plus fraîche que la mienne)



9
votes

Selon le Java Spécification de la langue pour le amélioré pour Énoncé, l'expression: xxx

est exécuté comme suit: xxx

Ainsi, l'expression (qui doit être de type itérable ) n'a que son itérateur () méthode appelée une fois.


1 commentaires

@ user1965283: Bienvenue à cela. Veuillez accepter la réponse: Stackoverflow.com/faq



1
votes

Dans votre exemple, le résultat de permuté (restant) est évalué avant l'un entrait dans la boucle. Bien que l'amélioration de la boucle ne soit vraiment rien de plus que le sucre syntaxique pour les itérateurs, il suit toujours les mêmes principes que d'autres boucles, il doit avoir un objectif à opérer avec avant de pouvoir faire autre chose.

Un exemple plus simple serait Quelque chose comme ça: xxx

c'est quelque chose que vous pouvez voir dans des projets qui ont lu dans une quantité indéterminée de lignes. L'expression entrée.hasnext () doit être évaluée en premier, puis vous pouvez boucler.


1 commentaires

Merci pour votre réponse. :)



2
votes

Si nous compilons ce test

    Set set = new HashSet();
    String s;
    for(Iterator iterator = set.iterator(); iterator.hasNext();)
        s = (String)iterator.next();


0 commentaires