Wer kann mir helfen bei dieser Java Aufgabe Anagramm (Mein code klappt nicht)?Siehe Foto?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich gehe an dieser Stelle einmal nur auf deinen ersten Satz ein, zu allem anderen hast du ja schon Antworten erhalten.

sorry für die unschöne Klassen Benennung aber ich hab sie nun mal so in java erstellt man kann ja nicht mehr ändern sonst tauchen Fehler auf

Natürlich kannst du Bezeichner im Nachgang nochmal ändern. In IDEs wie NetBeans oder Eclipse ist diese Funktion unter dem Refactoring-Menü zusammengefasst.

Wenn du einen Bezeichner auf diesem Wege änderst, werden auch alle anderen Vorkommen / Stellen, bei denen die Änderung notwendig ist, von der IDE mit geändert.

Wichtig wäre immer auch gleich hin zu schreiben, was für Fehler auftauchen, sonst muss man den Code erst mal ausführen. In deinem Fall ist es, Gott sie Dank, nicht nötig. Aber so für die Zukunft wäre es nett.

Ich gehe davon aus, dass du eine Exception erhälst? Es müsste eine StringIndexOutOfBoundsException sein.

Das Problem liegt in dieser Zeile s2.length()-i

Wenn du einen String hast, beispw. "Hallo", dann ist die Länge des Strings 5. Allerdings zählen wir ja von 0 an. Sprich. Die Indices von Hallo sind 0, 1, 2, 3, 4 (was die Länge 5 ergibt). Zu Beginn hast du i = 0 und s2.length() = 5. 5 - 0 = 5. Du willst also auf den Index 5 zugreifen, obwohl es nur 4 Indices gibt.

Mit einem einfachen Trick lässt sich das beheben. Probiers aus.

Zudem wirst du dich auch noch um ein weiteres Problem kümmern müssen. Beim Vergleich der einzelnen Buchstaben musst du zwischen Groß und Kleinschreibung unterscheiden.

Sprich "Hallo" ist ungleich "Ollah", da die beiden Os einmal groß und einmal klein sind.

Greetz

P.S. okay. Ich lese gerade, dass das Wort nur aus Kleinbuchstaben bestehen muss. Also alles okay :)

Nichtsnutz12 
Fragesteller
 17.12.2018, 21:24

asoo ok danke also ich hab da jetzt einfach -1 vor das -i hingeschrieben jetzt kommt die Fehlermeldung nicht mehr ja hattest recht diese StringOutof.... kam da jetzt klappts aber ich zähl ja nur rückwärts die Buchstaben ab von jeweils einem Buchstaben ich weiß nicht wie ich alle abzähle verstehst du was ich meine asoo und da steht es reicht wenn die Methode nur für Kleinbuchstaben funktioniert.

0

Erstmal das was du prüfst ist keine Anagramm, dein ansatz ist komplett falsch. Lese dir die aufgabe nochmal durch. Aber ich werde deinen Ansatz mal verfolgen.

Das erste problem was ich sehe ist

s2.charAt(s2.length()-i

i fängt bei 0 an. bedeutet wenn dein string 4 zeichen lang ist ruft fragt der nach dem char an stelle 4, leider ist 3 die letzte stelle in einem string der länge 4. Also bekommst du eine exception.

Und ich habe keine ahnung warum du die main klasse in irgendeine andere klasse reingepackt hast, das kann ich mir nicht erklären. So funktioniert es

public class KlasseLOL {
    int counter = 0;
   
    public boolean anagramm(String s1, String s2) {
        for(int i = 0; i<s1.length(); i = i + 1) {
            if(s1.charAt(i)==s2.charAt(s2.length()-1-i)) {
                counter = counter +1;
            }
        }
        return counter == s1.length();
    }
 

 
    public static void main(String[]args) {
        KlasseLOL anagramm = new KlasseLOL();
        if(anagramm.anagramm("mehl", "helm")) {
            System.out.println("Wort ist ein Anagramm");
        }else {
            System.out.println("Wort ist kein Anagramm");
        }
    }
}

So funktioniert es auf jeden fall.

Ich würde allerdings die counter variable erst in der anagramm methode declarieren, die benutzt du ja außerhalb dieser methode garnicht.

Nichtsnutz12 
Fragesteller
 17.12.2018, 21:27

ok danke ja jetzt klappts aber Ergebnis trotzdem funktioniert nicht weil kuck mal wenn man bei i 0 macht vergleicht ja das Programm den Buchstaben an der Stelle 0 mit dem letzten Buchstaben, im zweiten Durchgang den Buchstaben an Stelle 1 mit dem vorletzten, usw verstehst du also es muss ja irgendwie alle durchlaufen nicht immer auf den nächsten springen keine Ahnung wie Ichs erklären soll....

0
Nichtsnutz12 
Fragesteller
 20.12.2018, 09:39

???????

0
jort93  20.12.2018, 12:09
@Nichtsnutz12

Lösen musst du die aufgabe schon selber. Ich will dir ja nun nicht die ganze aufgabe lösen. Der code den du geschrieben hast funktioniert aber zumindest so.
Du brauchst halt nen neuen ansatz für die aufgabe.

Und du hast ja auch schon eine komplette lösung bekommen, von daher.

0

So wie ich es sehe prüft dein Code ob Wort-A jeweils Wort-B rückwärts darstellt. Laut Aufgabenstellung können die Buchstaben aber in beliebiger Reihenfolge vorliegen.

Du müsstest die Buchstaben beider Wörter alphabetisch sortieren und dann beide Strings auf Gleichheit testen.

https://stackoverflow.com/questions/15045640/how-to-check-if-two-words-are-anagrams

public boolean isAnagram(String firstWord, String secondWord) {
     char[] word1 = firstWord.replaceAll("[\\s]", "").toCharArray();
     char[] word2 = secondWord.replaceAll("[\\s]", "").toCharArray();
     Arrays.sort(word1);
     Arrays.sort(word2);
     return Arrays.equals(word1, word2);
}
Nichtsnutz12 
Fragesteller
 17.12.2018, 21:17

ja richtig aber ne ich überprüfe ob Buchstabe rückwärts vorkommt also charAt heißt ja Buchstabe

0
Dory1  17.12.2018, 21:21
@Nichtsnutz12

Ja, du prüfst ob Wort s1 das Wort s2 rückwärts ist. Das entspricht aber nicht der Aufgabenstellung.

Ein Anagramm eines Wortes ist ein Wort, das aus denselben Buchstaben in beliebiger Reihenfolge besteht.
2
Nichtsnutz12 
Fragesteller
 17.12.2018, 21:41
@Dory1

ja und wie machst du das? asoo mit Arrays sort? wird das dann Sortiert oder was? aber ich hab ja kein Array ich hab Strings hä ich bin total verwirrt was macht toCharARray()? dat hab ich ja noch nie gesehen

0
Dory1  17.12.2018, 21:45
@Nichtsnutz12

Ja, um die Buchstaben zu sortieren musst du die Strings zuerst in Arrays aus Unicode-Zeichen konvertieren. Auf diese Arrays kannst du dann .sort und .equals anwenden.

2