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(){}
}
Remarque :
suite au post : http://www.javafr.com/infomsg_TABLEAU-JAVA_1153515.aspx
exemple d'utilisation :
Object [] t = new Object[4];
t[0] = "1"; t[1] = "2"; t[2] = "3"; t[3]="4";
Permutations perm = new Permutations(t);
while (perm.hasNext()){
Object [] t2 = perm.next();
for (int i=0;i System.out.print(t2[i]);
}
System.out.println("");
}