Todos los k combinaciones posibles de lista con el tamaño n

Theodore Narliyski:

Estoy tratando de obtener todas las combinaciones posibles de tamaño K de una lista de tamaño N.

Tengo una lista de objetos que se lleva "humano" y yo estoy tratando de crear un nuevo ArrayList que se llena de objetos de la lista. Cada una de las listas serán una combinación diferente de objetos "humanos".

Un ejemplo sencillo con los números sería: A partir de una lista que consiste en 1,2,3 Quiero conseguir un ArrayList con la apariencia siguiente: [[1,2], [1,3], [2,3]]Yo tampoco me importaría si se ve así:[[1], [2], [3], [1,2], [1,3], [2,3]]

Aquí está mi código:

public void combination(List<Human> people, int k, ArrayList<List> result) {
    if (people.size() < k) {
        return;
    }
    if (k == 1) {
        for (Human hum : people) {
            List<Human> combinations = new ArrayList<Human>();
            combinations.add(hum);
            result.add(combinations);
        }
    }
    else if (people.size() == k) {
        List<Human> combinations = new ArrayList<Human>();
        for (Human hum : people) {
            combinations.add(hum);
        }
       result.add(combinations);
    }
    else if (people.size() > k) {
        for (int i = 0; i < people.size(); i++) {
            List<Human> combinations = new ArrayList<Human>();
            combinations.add(people.get(i));
            result.add(combinations);
            combination(people.subList(i + 1, people.size()), k - 1, result);
        }
    }
}

Estoy usando el último método en este sitio como referencia: https://hmkcode.com/calculate-find-all-possible-combinations-of-an-array-using-java/

En el momento en que sale el número correcto de los resultados en mi nuevo ArrayList, pero cada lista en el interior solamente consisten de una sola humano.

Yo muy sospechosas las mentiras de problemas en el último else ifporque tengo dificultades para entender la recursividad.

por favor no dude en hacer cualquier pregunta o sugerir cualquier otra aplicación para esto.

Amir MB:

El problema está en su bucle, que está llamando combinationla función sólo en sublistas continuas (por ejemplo, si el conjunto inicial es [1,2,3,4,5], que no están llamando a la función en la lista secundaria de [1,3,5 ]).

Además, tenga en cuenta que debe reemplazar la equalsfunción en su Humanclase.

    private void subsetsOf(List<Human> humans, int k, int index, Set<Human> tempSet, List<Set<Human>> finalSet) {
    if (tempSet.size() == k) {
        finalSet.add(new HashSet<>(tempSet));
        return;
    }

    if (index == humans.size())
        return;


    Human human = humans.get(index);

    tempSet.add(human);
    subsetsOf(humans, k, index+1, tempSet, finalSet);

    tempSet.remove(human);
    subsetsOf(humans, k, index+1, tempSet, finalSet);
}

public List<Set<Human>> combination(List<Human> humans, int k) {
    List<Set<Human>> result = new ArrayList<>();
    subsetsOf(humans, k, 0, new HashSet<Human>(), result);
    return result;
}

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=403939&siteId=1
Recomendado
Clasificación