Iterateurs de permutations

Contenu du snippet

public class Permutations implements java.util.Iterator{ 
    private boolean ended; // dit si on a fini d'iterer 
    private Object[] tab; // tableau 
    private int len; // longueur du tableau 
    private int pos; // position de l'objet ignore 
    private Permutations perm; // la permutation enfant 
    public Permutations(Object[] tab){ 
        this.tab = tab; 
        len = tab.length; 
        if (len==0){ 
            ended = true; 
        }else if (len==1){ 
            ended = false; 
            pos=-1; 
        }else{ 
            ended = false; 
            pos = 0; 
            gperm(); 
        } 
    } 
    //! permet de recuperer la permutation suivante (celle qui ignore pos) 
    private void gperm(){ 
        Object[] t = new Object[len-1]; 
        int d=0; 
        for (int i=0;i<len;i++){ 
            if (i==pos) d++; 
            else t[i-d]=tab[i]; 
        } 
        perm = new Permutations(t); 
    } 
    //! recupere l'objet suivant 
    public Object[] next(){ 
        if (len < 2){ 
            ended=true; 
            return tab; 
        }else{ 
            if (!perm.hasNext()){ 
                pos++; 
                gperm(); 
            } 
            Object[] result = perm.next(); 
            Object[] o = new Object[len]; 
            o[0]=tab[pos]; 
            for (int i=0;i<len-1;i++){ 
                o[i+1] = result[i]; 
            } 
            return o; 
        } 
    } 
    //! dit si il en reste a parcourrir 
    public boolean hasNext(){ 
        if (ended) return false; 
        return pos!=len-1 || perm.hasNext(); 
    } 
    public void remove(){} 
} 

Compatibilité : Java

A voir également