** C'est une histoire **
Non limité à Java, lors de l'écriture d'un programme, il y a des moments où vous devez écrire plusieurs boucles for.
Exemple: Je souhaite définir tous les éléments d'un tableau tridimensionnel de type int sur 1.
final int n = 10;
final int[][][] cube = new int[n][n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
cube[i][j][k] = 1;
}
}
}
Cependant, une telle boucle provoque une imbrication profonde et une augmentation inutile du nombre de lignes, ce qui entraîne une détérioration de la maintenabilité du programme. Par conséquent, considérons une méthode pour rendre unique plusieurs boucles for.
Pour résoudre le problème, vérifiez d'abord la syntaxe de la boucle for. [Eclipse JDT](https://help.eclipse.org/2019-12/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom% Selon 2FEnhancedForStatement.html), l'instruction for a la structure suivante.
for ( [ ForInit ]; [ Expression ] ; [ ForUpdate ] ) Statement
En outre, ForInit et ForUpdate sont définis comme suit.
ForInit: Expression { , Expression } ForUpdate: Expression { , Expression }
Puisque ForInit
et ForUpdate
peuvent spécifier plusieurs expressions, il semble possible d'écrire une mise à jour de variable dans ForUpdate
avec la déclaration de chaque variable requise dans plusieurs boucles for dans ForInit
.
Maintenant, faisons une seule boucle for.
Dans l'exemple précédent, il y a trois variables requises, ʻi, j, k`, donc la formule d'initialisation est
int i = 0, j = 0, k = 0
Cela semble aller.
Vient ensuite l'expression conditionnelle (de fin). Dans ce cas, ʻi qui contrôle la boucle la plus externe quelle que soit la valeur de
j, k`
i < n
Peut être écrit comme.
Enfin, réfléchissons à la formule de mise à jour.
Pensez dans l'ordre (k-> j-> i
) à partir des variables qui contrôlent l'intérieur de la boucle.
Tout d'abord, concernant «k», il devrait être incrémenté à chaque fois qu'une boucle est faite, et il devrait devenir 0 lorsque la valeur de k devient n.
k = (k + 1) % n
Peut être écrit.
Ensuite, en ce qui concerne «j», la synchronisation de mise à jour de «j» est la synchronisation lorsque «k» devient 0, et la valeur ne change pas autrement.
j = k == 0 ? (j + 1) % n : j
Il devient.
Enfin, ʻi, mais le timing de la mise à jour est
k == 0 && j == 0`
i = j == 0 && k == 0 ? i + 1 : i
est.
Lorsque les résultats jusqu'à présent sont intégrés, il peut être réécrit comme suit.
final int n = 10;
final int[][][] cube = new int[n][n][n];
for (int i = 0, j = 0, k = 0; i < n; k = (k + 1) % n, j = k == 0 ? (j + 1) % n : j, i = j == 0 && k == 0 ? i + 1 : i) {
cube[i][j][k] = 1;
}
Comparé au premier code triple boucle, l'imbrication est réduite et je pense que cela donne une impression nette.
Cette fois, j'ai présenté comment convertir plusieurs boucles for en boucles simples. Veuillez utiliser ceci comme référence pour améliorer la lisibilité de votre code!
Recommended Posts