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.
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; } }