Originariamente inviato da Hermiod
Ciao andbin e grazie per la tua risposta!
Hai centrato tutto in pieno, scusa se ho trascurato alcune informazioni!
Perfetto, allora gestire la generazione di quella sequenza in modo dinamico, cioè con un numero arbitrario di righe nell'array 'mat' è abbastanza semplice.

Non puoi appunto usare cicli annidati, perché in questo modo andresti a "cablare" la classe 'k', ovvero il numero di elementi nel gruppo.

Io ti faccio l'esempio con 3 righe:

codice:
String mat[][] = {
  {"AA", "Aa", "aa"},
  {"BB", "Bb", "bb"},
  {"CC", "Cc", "cc"},
};
Ecco la sequenza (a fianco metto degli indici):

codice:
AA BB CC   0 0 0
AA BB Cc   0 0 1
AA BB cc   0 0 2

AA Bb CC   0 1 0
AA Bb Cc   0 1 1
AA Bb cc   0 1 2

AA bb CC   0 2 0
AA bb Cc   0 2 1
AA bb cc   0 2 2

Aa BB CC   1 0 0
Aa BB Cc   1 0 1
Aa BB cc   1 0 2
.....
.....
aa bb CC   2 2 0
aa bb Cc   2 2 1
aa bb cc   2 2 2
Gli indici a fianco sono gli indici 0 1 2 dentro una riga es. {"AA", "Aa", "aa"}.

Come ti sembra la progressione degli indici? Lineare e predicibile, no?
Semplicemente istanzia un array int[] con un numero di elementi uguale al numero di righe in 'mat'. L'array è già inizializzato con tutti 0.
Per ogni combinazione nell'array int[] puoi banalmente comporti un array con le stringhe risultanti.

Poi ti basta fare un metodo che faccia "progredire" gli indici partendo dal fondo, come si farebbe in un sistema di numerazione. Ripeto: per ottenere la "prossima" combinazione degli indici, basta fare un semplice ciclo for in cui si incrementa l'indice:
- se è minore di 2, incrementi e puoi uscire subito dal for.
- se è 2, azzeri e il ciclo passa all'indice successivo.

Se lo fai "generico" puoi gestire sia un numero arbitrario di righe nell'array 'mat' sia un numero arbitrario di elementi nelle righe (anche potenzialmente con righe di lunghezza differente!).

P.S. consiglio implementativo: fai una classe apposita a cui passi es. al costruttore il tuo array String[][] e con un metodo "next" (o "successivo", come vuoi) che ti fornisce la prossima combinazione come String[] (o null se finita la sequenza). Come design alternativo: un next() che restituisce boolean e un getCombinazione() che restituisce String[].
Sono varianti che puoi scegliere tu.