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


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

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.