Innanzitutto bisogna precisare una cosa. La sequenza che hai postato in realtà sarebbe da vedere come l'insieme di sequenze distinte, dove ciascuna sequenza delle combinazioni ha una classe k (numero di elementi) ben precisa. E ciascuna di queste sequenze è da trattare in modo separato.
Per una certa classe k, enumerare le combinazioni "semplici" è banale se puoi/vuoi "cablare" la classe k in una serie di cicli "annidati".
Ad esempio:
codice:public class CombinazioniSempliciClasseK_2 { public static void main(String[] args) { int[] valori = { 1, 2, 3, 4 }; for (int i = 0; i < valori.length-1; i++) { for (int j = i+1; j < valori.length; j++) { System.out.println("comb: " + valori[i] + valori[j]); } } } }
Nel codice sopra, il numero di valori è arbitrario, puoi aggiungere 5, 6, 7 .... quanti ne vuoi. Ma la classe k è fissa a 2, perché è "cablata" nel fatto che ci sono 2 cicli annidati.
Se non è questo che puoi/vuoi fare, c'è un'altra soluzione: realizzare un algoritmo più generico in cui la classe k può essere "arbitraria". Non è difficilissimo però devi cambiare punto di vista, la enumerazione delle combinazioni semplici devi vederla un po' (anzi molto) come se fosse un "sistema di numerazione", in cui gli indici (dei valori nell'array) progrediscono secondo una logica che puoi facilmente dedurre e poi generalizzare guardando una sequenza più o meno lunga di combinazioni per una certa classe k.