2010-10-20 4 views
2

Juste une question rapide, disons, Car class extends HashMap (String, String).Pour utiliser la rupture dans une boucle for ou pas?

1.

for (Car car : carList) { 
    if (car.isEmpty) { 
     break; 
    } 
    doSomething(); 
} 

2.

for (Car car : carList) { 
    if (!car.isEmpty) { 
     doSomethingElse(); 
    } 
} 

Lequel des deux ci-dessus est mieux? Merci.

---- édité ---- Désolé, je n'ai pas précisé mon point.

La méthode doSomething() est en train de faire différentes choses. Je les ai changés en doSomething() et doSometingElse().

Ma question est, allez-vous mettre tout le processus en un si()? ou d'abord rompre la boucle si la condition if() ne satisfait pas.

Merci.

+0

Qu'est-ce que vous essayez de faire? Les deux boucles font des choses différentes. La première boucle fait appel à 'doSomething()' après avoir trouvé la première voiture vide. La deuxième boucle appelle 'doSomething()' pour chaque voiture non vide. En fonction de ce que vous devez faire, je pourrais vous recommander une boucle while ou une boucle 'for'. –

+1

"Quel est le meilleur" est subjectif, surtout quand les exemples ci-dessus font des choses différentes ... Dites-nous quel est votre résultat souhaité et nous pouvons mieux décider qui satisfera cela et est donc "meilleur" – MadMurf

+0

Désolé je n'ai pas fait valoir mon point clair, j'ai édité le poste, merci – Gnavvy

Répondre

0

Si vous vouliez dire "continuer" et non "casser", alors je dirais que ne pas continuer ou casser c'est mieux.

Ce n'est pas une grosse affaire, mais les déclarations comme continuer, casser et retourner sont toutes des déclarations essentiellement goto qui ont été habillées un peu. Au lieu d'aller à une ligne ou d'obtenir une étiquette, ils se placent en haut ou en bas d'une structure de contrôle - cela oblige le programmeur à réfléchir un peu, ce qui signifie une perte de temps et des erreurs supplémentaires. Ce n'est pas une grosse affaire, et plusieurs fois ces structures clarifieront votre code, mais si vous avez le choix et qu'elles semblent faire essentiellement la même chose, faites en sorte qu'il ne s'agisse pas d'envoyer un contrôle ailleurs.

+0

Merci Bill. J'envisageais de faire une pause parce que ça rendait le code un peu plus facile à lire. – Gnavvy

+0

Je dirais que moins de code est plus lisible dans ce cas que plus de code (avec l'instruction break). Vous pouvez avoir moins de code en inversant la condition et ne pas avoir besoin d'une pause/continuer. –

+0

@matt b Pas vraiment, le "Moins de code est plus lisible" est une sorte d'erreur, sauf si vous parlez 20 lignes de code supplémentaires. Changer une ligne compacte à deux ou trois lignes sera presque toujours plus lisible (je grince chaque fois que je vois le mot "Expressive" ces jours-ci). –

1

Ils font des choses complètement différentes. Le premier s'entraînera après avoir vu la première voiture vide. La deuxième version «fera quelque chose» pour chaque voiture non vide. Je pense, vous pouvez utiliser l'opérateur continue au lieu de break.

8

Ils font des choses complètement différentes. Le premier arrête d'itérer dès que la condition est vraie, alors que le second va simplement sauter le traitement pendant les itérations où la condition est fausse. Changer le break en continue dans le premier les fera fonctionner de la même manière.

+0

Désolé, je n'ai pas précisé mon point, j'ai édité le poste, merci – Gnavvy

+0

Sauf le second appelle dosomethingelse() tandis que le anciens appels dosomething(). – Matt

0

Ces 2 boucles ne font pas la même chose

  1. mettra fin à la boucle la première fois qu'il trouve une voiture vide avec isEmpty sauter des voitures après le premier vide. Vous pouvez faire ce travail comme 2. si vous changez 'break' en 'continue'

  2. fera quelque chose pour toutes les voitures non vides.

+0

merci pour votre réponse. Je suis désolé que je n'ai pas fait mon point clair, j'ai édité le poste, merci – Gnavvy

0

Cela dépend de ce que vous essayez de faire, la première boucle se terminera dès que la condition est rencontre, tandis que le second itérera throuh tous les hashmap.

0

Si vous voulez un comportement différent selon que la voiture est vide ou non, vous pouvez utiliser une instruction if else. Utilisez break si vous voulez arrêter d'itérer carList.

for (Car car : carList) { 
    if (car.isEmpty) { 
     doSomething(); 
    } 
    else { 
     doSomethingElse(); 
    } 
} 
0

Comme tout le monde l'a souligné, la version break sortira tôt. La réponse dépend alors de ce que vous voulez faire.

Si vous avez fini de faire ce que vous devez faire, éclatez dès que vous avez terminé. Pourquoi gaspiller des cycles CPU? D'un autre côté, si vous devez passer par toute la liste à dosomethingelse() alors ne pas éclater.

Étiez-vous censé avoir deux fonctions nommées différentes ou devraient-elles toutes deux être appelées dosomething()?

0

Est-ce ce que vous cherchez?

for (Car car : carList) { 
    if (car.isEmpty) { 
     doSomething(); 
    } 
    else { 
     doSomethingElse(); 
    }  
} 

Ou recherchez-vous

for (Car car : carList) { 
    if (car.isEmpty) { 
     break; 
     //STOP ITERATING THROUGH THE REST OF THE LIST 
     //(doSomething & soSomethingElse may have been called a few times already) 
    } 
    else { 
     doSomething(); 
    } 
    doSomethingElse(); 
} 

Il y a aussi d'autres options, votre précision est toujours pas clair ... pour moi en tout cas ...

+0

merci MadMurf, votre réponse est juste. Je voulais juste déplacer le doSomethingElse() de la partie if(). le message dans le commentaire de paxdiablo est ce que je cherchais. – Gnavvy

Questions connexes