Venho procurando pelos fóruns da vida uma aplicação Java que realize a analise combinatória num arraylist, o código abaixo quase atendeu minha necessidade não fosse pelo fato dele desconsiderar valores repetidos dentro da minha list. Explicando melhor, vamos supor que eu tenha o Array: { 30, 10, 13 } o resultado do código abaixo será: [[10.0], [13.0], [30.0], [10.0, 13.0], [10.0, 30.0], [13.0, 30.0], [10.0, 13.0, 30.0]] exactamente o que preciso, mas se algum dos valores do meu Array estiver repetido ex: { 30, 10, 10 } o resultado fica errado: [[10.0], [10.0], [30.0], [10.0, 30.0]] deveria ser: [[10.0], [10.0], [30.0], [10.0, 10.0], [10.0, 30.0],[10.0, 30.0],[10.0, 10.0, 30.0]]. Como não conheço muito de java não estou conseguindo ajustar esse código para atender minha necessidade se alguém puder me ajudar comentando ou ajustando para que ele traga o resultado correto deste já agradeço.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
public class Comb {
/**
* @param args
*/
public static void main(String[] args) {
double[] status = new double[] { 30, 10, 13 }; //aqui pode ser qualquer objeto que implemente Comparable
List<SortedSet<Comparable>> allCombList = new ArrayList<SortedSet<Comparable>>(); //aqui vai ficar a resposta
for (double nstatus : status) {
allCombList.add(new TreeSet<Comparable>(Arrays.asList(nstatus))); //insiro a combinação "1 a 1" de cada item
}
for (int nivel = 1; nivel < status.length; nivel++) {
List<SortedSet<Comparable>> statusAntes = new ArrayList<SortedSet<Comparable>>(allCombList); //crio uma cópia para poder não iterar sobre o que já foi
for (Set<Comparable> antes : statusAntes) {
SortedSet<Comparable> novo = new TreeSet<Comparable>(antes); //para manter ordenado os objetos dentro do set
novo.add(status[nivel]);
if (!allCombList.contains(novo)) { //testo para ver se não está repetido
allCombList.add(novo);
}
}
}
Collections.sort(allCombList, new Comparator<SortedSet<Comparable>>() { //aqui só para organizar a saída de modo "bonitinho"
@Override
public int compare(SortedSet<Comparable> o1, SortedSet<Comparable> o2) {
int sizeComp = o1.size() - o2.size();
if (sizeComp == 0) {
Iterator<Comparable> o1iIterator = o1.iterator();
Iterator<Comparable> o2iIterator = o2.iterator();
while (sizeComp == 0 && o1iIterator.hasNext() ) {
sizeComp = o1iIterator.next().compareTo(o2iIterator.next());
}
}
return sizeComp;
}
});
System.out.println(allCombList);
}
}