Anagramm

Hannek92

Mitglied
Also ich gehe gerade verschiedene Übungen durch, unter Anderem auch eine Methode zu schreiben, die prüft, ob zwei String Anagramme voneinander sind.
Ich bin bis jetzt soweit gekommen, dass ich die beiden Strings in zwei char [] arrays speichere .. und dann hätte ich gedacht, dass ich mittels verschachtelter for-schleifen prüfen könnte ob irgendwo das zeichen vom ersten char array im zweiten vorhanden ist..

hier ist soweit mein code, aber mir wird immer true zurück gegeben :/ Wo liegt mein Fehler?

Java:
public class Anagramme {
    public static boolean ana (String s1, String s2) {
        boolean anagramm = false;
        char[] buchstabe1 = new char[s1.length()];
        char[] buchstabe2 = new char[s2.length()];
       
        for ( int i = 0; i< s1.length()-1; i++) {
            buchstabe1[i] = s1.charAt(i);
        }
        for ( int j = 0; j < s2.length()-1; j++) {
            buchstabe2[j] = s2.charAt(j);
        }
       
        for (int k = 0; k < buchstabe1.length ; k++){
            for (int l = 0; l < buchstabe2.length; l++) {
                if(buchstabe1[k] == buchstabe2[l]) {
                    anagramm = true;
                }else {
                    anagramm = false;
                }
            }
        }return anagramm;
    }
   
    public static void main(String[] args) {
        String eins = "maus";
        String zwei = "zaum";
       
        System.out.println(ana(eins,zwei));
    }
}
 

javampir

Bekanntes Mitglied
hi,
erstmal: für deine ersten beiden for-schleifen gibt es die methode String.toCharArray().
hier stimmt das logiksystem nocht nicht. du durchläufst buchstabe für buchstabe und prüfst, ob er im anderen wort enthalten ist. allerdings wird deine variable anagramm immer wieder überschrieben; außerdem wird nicht auf die anzahl der buchstaben geachtet.
javampir
 

JStein52

Top Contributor
Ich würde nach dem Umwandeln in CharArray erstmal gucken ob beide die gleiche Länge haben, falls nicht ist es schon mal kein Anagramm ( return false; ) Falls sie gleich sind gehst du in einer Schleife über das erste Array und überprüfst ob der i-te Buchstabe im einen Array gleich dem (length-i-1) -ten Buchstaben im anderen Array ist. Falls nicht,
return false. Und hinter der Schleife ein return true denn wenn du da hinkommst war es ein Anagramm. Falls ich den den Begriff Anagramm richtig im Kopf habe ;);)
 

Bitfehler

Bekanntes Mitglied
Hi,

wie wäre es denn mit folgenden Ansatz:
  1. Prüfe, ob die beiden Strings die gleiche Länge haben. Ist das nicht der Fall, kannst du schon false zurückgeben und musst gar nicht weiter machen.
  2. Speicher deine beiden Strings in zwei unterschiedliche Arrays (Stichwort: String.toCharArray()). Anschließend könnte man beide Arrays sortieren (Stichwort: Arrays.sort()).
  3. Sind die beiden Arrays sortiert, kannst du mit einer for-Schleife über die Länge des Arrays laufen und die Einträge in beiden miteinander vergleichen. Sind die an einer Stelle nicht gleich, dann false und Abbruch der Schleife. Sonst true.
Neben den Anmerkung, die bereits genannt wurden, solltest du dir überlegen, ob es sinnvoll ist, alle Buchstaben per toLowerCase oder toUpperCase zu behandeln, um möglichen Problemen mit Groß- und Kleinschreibung vorzubeugen.

Schönen Abend noch
 

JStein52

Top Contributor
Der Vorschlag von Bitfehler ist richtig, denn meiner deckt nur die speziellen Anagramme ab die von vorne und hinten gelesen gleich sind ( Regal und Lager z.B.) Anagramme sind aber beliebige Permutationen der beteiligten Buchstaben.
 

Hannek92

Mitglied
Hallo ihr, danke euch schon einmal für eure Antwort.. Ich habe versucht Eure Anregungen soweit umzusetzen.. aber kriege noch die Fehlermeldung ArrayIndexOutOfBoundsException.. sorry.. bin anscheinend irgendwie zu blöd das richtig zu machen

Java:
public class Anagramme {
    public static boolean ana (String s1, String s2) {
        boolean anagramm = false;
        /*char[] buchstabe1 = new char[s1.length()];
        char[] buchstabe2 = new char[s2.length()];
     
        for ( int i = 0; i< s1.length()-1; i++) {
            buchstabe1[i] = s1.charAt(i);
        }
        for ( int j = 0; j < s2.length()-1; j++) {
            buchstabe2[j] = s2.charAt(j);
        }*/
        if(s1.length() == s2.length()){
        char[] buchstabe1 = s1.toCharArray();
        char[] buchstabe2 = s2.toCharArray();
     
        sort(buchstabe1);
        sort(buchstabe2);
     
        for(int i = 0; i < buchstabe1.length-1; i++) {
            if ( buchstabe1[i] == buchstabe2[i]) {
                anagramm = true;
            } else {
                anagramm = false;
            }
        }
     
    }else {
        anagramm = false;
    }
    return anagramm;
}
/*Wollte extra eine Methode sort machen, 
da die auch gerne in der Klausur abgefragt wird, 
und dafür lerne ich momentan.
mit sort() wäre das natürlich einfacher, aber ich hoffe, dass das so auch geht?! */
    public static int[] sort (char [] a) {
        int[] sortiert = new int[a.length];
     
        for ( int i = 0; i< a.length; i ++) {
            sortiert[i] = (int) a[i];
        }
        for ( int j = 0 ; j < sortiert.length; j++) {
            if( sortiert[j] > sortiert[j+1] ) {
                int temp = sortiert[j];
                sortiert[j] = sortiert[j+1];
                sortiert[j+1] = temp;
            }
        } return sortiert;
    }
 
    public static void main(String[] args) {
        String eins = "maus";
        String zwei = "zaum";
     
        System.out.println(ana(eins,zwei));
    }
}
 
Zuletzt bearbeitet:

Hannek92

Mitglied
Ou, die Exception habe ich schon behoben.. ich glaub der Fehler lag daran, dass ich in der Sort Methode die For-Schleife bis sortiert.length iteriert hab lassen und nicht sortiert.length-1 ...
aber mir wird immer noch true zurück gegeben -.-
 

Elenteria

Bekanntes Mitglied
buchstabe.length - 1 muss buchstabe.length sein, sonst hörst du zu früh auf.
Auserdem überschreibst du immernoch ständig das Ergebnis. wenn du jetzt z.b. abcd mit abfd vergleichst wird er dir bei i = 2 anagramm auf false setzten und beim nächsten Durchlauf wieder auf true.
Es reicht wenn du anagramm am Anfang der Methode auf true setzt und dann nur im Fehlerfall auf false.

Und geh nochmal deine sort-Methode durch. Die sortiert noch nicht richtig.
 

JStein52

Top Contributor
Und du hast zwar eine sort-Methode geschrieben die auch ein sortiertes array zurückliefert. Aber oben beim Vergleich der Zeichen arbeitest du weiterhin mit den ursprünglichen unsortierten buchstaben-Arrays. Du musst natuerlich die Arrays untersuchen die dir deine sort-Methode zurückliefert !

Edit: und du kannst dir das mit der anagramm-Variablen die du auf true und false setzt komplett sparen, sobald du einmal ein nicht passendes Zeichen findest machst du return false; Und wenn du ans Ende bzw. hinter deine Schleife kommt hat alles gepasst und du machst return true;
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben