Generar combinaciones de tamaño N a partir de una lista

Crea un método genérico que devuelva todas las combinaciones de tamaño n de una colección que ya está ordenada. Conserva el orden de los elementos de entrada dentro de cada combinación y devuelve las combinaciones en orden lexicográfico ascendente. Los elementos pueden ser números, cadenas o cualquier otro tipo de elemento compatible con el código inicial proporcionado.

Ejemplos

Program.combo(List.of(1, 2, 3, 4), 1) ➞ List.of(List.of(1), List.of(2), List.of(3), List.of(4))

Program.combo(List.of(1, 2, 3, 4), 2) ➞ List.of(List.of(1, 2), List.of(1, 3), List.of(1, 4), List.of(2, 3), List.of(2, 4), List.of(3, 4))

Program.combo(List.of(1, 2, 3, 4), 5) ➞ List.of()

Program.combo(List.of(1, 2, 3, 4), 0) ➞ List.of(List.of())

Notas

  • El orden lexicográfico compara primero los primeros elementos: [1, 2] aparece antes que [2, 4]. Cuando los primeros elementos coinciden, se comparan los segundos: [1, 2] aparece antes que [1, 3], y así sucesivamente.
  • Devuelve una colección externa vacía si n supera la longitud de la entrada.
  • Devuelve una combinación vacía si n es 0, porque existe exactamente una combinación de longitud cero.