Énumérer un ensemble comme si on avait des boucles imbriquées

Soyez le premier à donner votre avis sur cette source.

Vue 3 745 fois - Téléchargée 267 fois


Description

On est parfois amené à devoir faire des boucles imbriquées les unes dans les autres, pour itérer les différentes combinaisons possibles, par exemple comme ceci :

for (long t0 = 0; t0 <= 9; t0++ )
     for (long t1 = 0; t1 <= 9; t1++ )
         for (long t2 = 0; t2 <= 9; t2++ )
             for (long t3 = 0; t3 <= 9; t3++ )
                 System.out.println(t0 + " " + t1 + " " + t2 + " " + t3);

Avec la classe Enumeration déposée ici, le code précédent devient simplement :

for (long[] tab : new Enumeration(4, 0, 9, 1, false))
     System.out.println(tab[0] + " " + tab[1] + " " + tab[2] + " " + tab[3]);

Les avantages sont immédiats, d'une part il n'y a plus à imbriquer soi même les boucles et d'autre part le nombre de boucles à imbriquer peut être dynamique. Sans oublier la concision du code qui le rend ainsi beaucoup plus maintenable.

Il est également possible de ne vouloir que les combinaisons d'éléments qui ont des valeurs distinctes, dans ce cas on aurait pu faire :

for (long t0 = 0; t0 <= 9; t0++ )
    for (long t1 = 0; t1 <= 9; t1++ )
       if (t1 != t0)
            for (long t2 = 0; t2 <= 9; t2++ )
                if (t2 != t1 && t2 != t0)
                    for (long t3 = 0; t3 <= 9; t3++ )
                        if (t3 != t2 && t3 != t1 && t3 != t0)
                            System.out.println(t0 + " " + t1 + " " + t2 + " " + t3);

Avec la classe Enumeration il suffit de modifier la valeur du booléen :

for (long[] tab : new Enumeration(4, 0, 9, 1, true))
     System.out.println(tab[0] + " " + tab[1] + " " + tab[2] + " " + tab[3]);

Il est également possible de faire des combinaisons un peu plus compliquées, avec des bornes de début et de fin spécifiques à chaque boucle et divers pas d'incrémentation (positifs ou négatifs).

Exemple

Code


import java.util.Arrays;

import ccm.kx.enumerator.Bounds;
import ccm.kx.enumerator.Enumeration;

public class Test
{
    public static void main(String[] args)
    {
        Enumeration e = new Enumeration(3, Bounds.make(1, 5, 9), Bounds.make(3), Bounds.make(1, -1, -2), true);
        
        for (long[] tab : e)
            System.out.println(Arrays.toString(tab));
        
        System.out.println("\n" + e.getCardinality() + " résultats");
    }
}

Résultat


[1, 5, 9]
[1, 5, 7]
[1, 5, 3]
[1, 4, 9]
[1, 4, 7]
[1, 4, 5]
[1, 4, 3]
[1, 3, 9]
[1, 3, 7]
[1, 3, 5]
[2, 5, 9]
[2, 5, 7]
[2, 5, 3]
[2, 4, 9]
[2, 4, 7]
[2, 4, 5]
[2, 4, 3]
[2, 3, 9]
[2, 3, 7]
[2, 3, 5]
[3, 5, 9]
[3, 5, 7]
[3, 4, 9]
[3, 4, 7]
[3, 4, 5]

25 résultats

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

Twinuts
Messages postés
5340
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 septembre 2019
82 -
Hello,

Je n'ai pas regardé le code, clea dit j'aime beaucoup l'idée.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.