Alle Möglichkeiten eines Wortes angeben

melisax

Mitglied
Wie kann man den folgenden Code kürzen, sodass trotzdem alle Kombis angezeigt werden?

import java.util.Scanner;
public class Reihenfolge {
public static void main(String[] args) {

System.out.print("Ein Wort mit 3 Zeichen eingeben: ");
Scanner scan = new Scanner(System.in);
char a = scan.findWithinHorizon(".", 0).charAt(0);
char b = scan.findWithinHorizon(".", 0).charAt(0);
char c = scan.findWithinHorizon(".", 0).charAt(0);

System.out.print(a); System.out.print(b); System.out.print(c); System.out.println(" ");

System.out.print(a); System.out.print(c); System.out.print(b); System.out.println(" ");

System.out.print(b); System.out.print(a); System.out.print(c); System.out.println(" ");

System.out.print(b); System.out.print(c); System.out.print(a); System.out.println(" ");

System.out.print(c); System.out.print(b); System.out.print(a); System.out.println(" ");

System.out.print(c); System.out.print(a); System.out.print(b);

scan.close();

}
}
 
Was genau soll das Ziel der Kürzung sein?

Generell kann man die Permutationen statt manuell auch durch ein Programm erzeugen lassen. Das hat dann den Vorteil, dass es mit jeder Anzahl an Elementen funktionieren kann - aber der Code wird halt komplexer, weil da etwas mehr gemacht wird, dass man erst einmal verstehen muss.

Wenn es nur um das Kürzen von genau diesem Code geht, dann würde ich da:
1) Den Block mit dem Scanner würde ich umschreiben - Das würde dann nicht wirklich kürzer aber vom Ablauf her wäre es logischer (Weil ein Wort eingelesen und dann verarbeitet würde)

2) Die ganzen einzelnen Ausgaben lassen sich zusammen fassen. Das kann z.B. jeweils etwas sein wie:
System.out.println("" + a + b + c + " ");
oder
System.out.println(String.format("%s%s%s ", a, b, c));
oder
System.out.printf("%s%s%s %n", a, b, c);

Und so wie die print Aufrufe einer Zeile zusammen gefasst wurden, kann man das auch noch für die weiteren Aufrufe machen.
 
alle Kombis angezeigt werden?
Hier eine Möglichkeit wie man für beliebige Wörter alle Permutationen ausgeben kann.
1631658018363.png
[CODE lang="java" title="TestPermutate" highlight="25-38"]import java.util.Scanner;

public class TestPermutate {
private static Scanner input = new Scanner(System.in);

public static void main(String[] args) {
System.out.print("Wort eingeben >");
String word = input.next();
int num = permutate(word);
System.out.println(String.format("\n%d Permutationen erzeugt!", num));
}

private static String charsToString(char[] letters) {
StringBuffer tmp = new StringBuffer();
for (int i = 0; i < letters.length; i++)
tmp.append(letters);
return tmp.toString();
}

public static int permutate(String word) {
return permutate(word.length(), word.toCharArray(), 0);
}

private static int permutate(int step, char[] letters, int cnt) {
if (step == 1) {
System.out.println(charsToString(letters));
cnt++;
} else {
cnt = permutate(step - 1, letters, cnt);
for (int i = 0; i < step - 1; i++) {
if (step % 2 == 0)
swap(letters, i, step - 1);
else
swap(letters, 0, step - 1);
cnt = permutate(step - 1, letters, cnt);
}
}
return cnt;
}

private static void swap(char[] array, int a, int b) {
char tmp = array[a];
array[a] = array;
array = tmp;
}
}[/CODE]
 
Ohne Rekursion geht's so:
Java:
    public static void permute(final String s, final Consumer<char[]> consumer) {
        char[] a = s.toCharArray();
        
        consumer.accept(a);

        int n = a.length;
        int[] p = new int[n];
        int i = 1;
        while (i < n) {
            if (p[i] < i) {
                int j = ((i % 2) == 0) ? 0 : p[i];

                char temp = a[i];
                a[i] = a[j];
                a[j] = temp;

                consumer.accept(a);

                p[i]++;
                i = 1;
            } else {
                p[i] = 0;
                i++;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        permute("h", a -> System.out.println(Arrays.toString(a)));
        permute("ha", a -> System.out.println(Arrays.toString(a)));
        permute("hal", a -> System.out.println(Arrays.toString(a)));
        permute("hall", a -> System.out.println(Arrays.toString(a)));
        permute("hallo", a -> System.out.println(Arrays.toString(a)));
    }
 

Zurück
Oben