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(){} }