Gerar combinações de tamanho N a partir de uma lista

Crie um método genérico que retorne todas as combinações de tamanho n de uma coleção que já está ordenada. Preserve a ordem dos elementos de entrada dentro de cada combinação e retorne as combinações em ordem lexicográfica crescente. Os elementos podem ser números, strings ou qualquer outro tipo de elemento compatível com o código inicial fornecido.

Exemplos

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())

Observações

  • A ordem lexicográfica compara primeiro os primeiros elementos: [1, 2] vem antes de [2, 4]. Quando os primeiros elementos são iguais, compare os segundos: [1, 2] vem antes de [1, 3], e assim por diante.
  • Retorne uma coleção externa vazia se n exceder o tamanho da entrada.
  • Retorne uma combinação vazia se n for 0, pois existe exatamente uma combinação de tamanho zero.