Próbuję zaimplementować metodę, która wykorzystuje wiele tablic String [], aby wydrukować listę słów, która zawiera każdą możliwą kombinację ciągów znaków w tablicach, w kolejności i przy użyciu max. 1 ciąg każdej tablicy.

Przykład: {"this" | "that"} {"is" | "was"} {"cool" | "lame"}

String[] array1 = {"this", "that"};
String[] array2 = {"is", "was"};
String[] array3 = {"cool", "lame"};

Należy użyć dla następującego wyjścia:

thisiscool
thatiscool
thiswascool
thatwascool
thiswaslame
thatwaslame
thisislame
thatislame

Eksperymentowałem z zagnieżdżonymi pętlami for:

String out1 = "";
for(int a = 0; a < array1.length; a++) {
            out1 = array1[a];
            System.out.println(out1);
            for(int b = 0; b < array2.length; b++) {
                out1 += array2[b];
                System.out.println(out1);
                for(int c = 0; c < array3.length; c++) {
                    out1 += array3[c];
                    System.out.println(out1);

To jednak nie działało dobrze. Może jest lepsze podejście do tego?

1
c0rnfl4k3s 22 marzec 2020, 23:15

2 odpowiedzi

Najlepsza odpowiedź

@Supercool. już pozostawił doskonałą odpowiedź.
Ale według Twojej opinii próbowałem dowiedzieć się, czy istnieje lepszy sposób wizualizacji niż zagnieżdżone pętle for i znalazłem sposób na „rekurencyjne wywołanie"

Używając „double array” i „recursive”,
chociaż dodajesz nową tablicę, nie musisz pisać dodatkowej pętli for .

Lubię to

public class StackOver
{
    static String[][] array = {{"this","that"},
                              {"is","was"},
                              {"cool","lame"},};

    public static void recString(String[][] a, int index, String output) {
        //make break-point
        if(index == a.length) {             //if 'index' reached to the end of array 'a'?
            System.out.println(output);     //print out string 'output' that collected so far
            //output should be = (a[0][?] + a[1][?] +...+ a[length-1][?])
            return;                         //And end the method.
        }

        // if 'index' didn't reach to the end of array :: 
        //If there's an array that hasn't been explored yet,
        for(int i = 0; i < a[index].length; i++) {
            recString(a, index+1, output + a[index][i]);
            //Add 1 to 'index' and add String out put that added '[index][i]' 
            //as parameters and call this method again.

            //This form is called recursive call!
        }
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String t = "";

        recString(array,0,t);
    }
 }

enter image description here

Nawet jeśli tablica się zmieni, za pomocą wywołań rekurencyjnych możesz sprawdzić każdą tablicę bez zmiany kodu i narysować możliwe kombinacje.

Dawny).

static String[][] array = {{"I","You","They"},
                               {"love","hate"},
                               {"me","you"},
                               {"too","either"},};

Cóż, gramatyka jest trochę niezręczna, ale to przykład na nieco dłuższe rozciągnięcie aranżacji.

enter image description here

1
J4BEZ 23 marzec 2020, 06:56
   String[] array1 = {"this", "that"};
   String[] array2 = {"is", "was"};
   String[] array3 = {"cool", "lame"};
   String text="";
   for(int a = 0; a < array1.length; a++) {
        text=array1[a];
        for(int b = 0; b < array2.length; b++) {
            text+=array2[b];
            for(int c = 0; c < array3.length; c++){
                System.out.println(text+array3[c]);
            }
            text=array1[a];
        }
   }

Demonstracja tej samej logiki w JS

Uruchom następujący fragment

let array1 = ["this", "that"];
let array2 = ["is", "was"];
let array3 = ["cool", "lame"];
let text="";
for(let a = 0; a < array1.length; a++) {
    text=array1[a];
    for(let b = 0; b < array2.length; b++) {
        text+=array2[b];
         for(let c = 0; c < array3.length; c++){
              console.log(text+array3[c]);
         }
         text=array1[a]
    }
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
2
M A Salman 22 marzec 2020, 23:05