Algoritmo java para combinação sem repetição de elementos de uma lista
Segue algoritmo java que fiz para combinação de elementos de uma lista de objetos quaisquer que utiliza uma lógica de soma de bits para fazer o agrupamento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import java.util.ArrayList; import java.util.List; public class App { public static void main(String[] args) { List<Object> lista = new ArrayList<Object>(); lista.add("A"); lista.add("B"); lista.add("C"); lista.add("D"); lista.add("E"); List<List<Object>> combinacoes = combina(lista, 2); for (List<Object> combinacao : combinacoes) { System.out.println(combinacao.toString()); } } public static List<List<Object>> combina(List<Object> lista, int n) { List<List<Object>> combinacoes = new ArrayList<List<Object>>(); int size = lista.size(); char[] chars = new char[size]; for (long i = 0, max = 1 << size; i < max; i++) { int soma = 0; for (int j = 0; j < size; j++) { chars[j] = (char) (((i >>> (size - j - 1)) & 1) + '0'); if (chars[j] == '1') { soma++; } } if (soma == n) { List<Object> combinacao = new ArrayList<Object>(); for (int k = 0; k < size; k++) { if (chars[k] == '1') { Object obj = lista.get(k); combinacao.add(obj); } } combinacoes.add(combinacao); } } return combinacoes; } } |