Anagramm mit Strings und Methode

Diskutiere Anagramm mit Strings und Methode im Java Basics - Anfänger-Themen Bereich.
X

xImMonti

Moin,
habe eine Aufgabe bekommen die lautet wie folgt:
Aufgabe 4: Anagramme (4 Punkte) Ein Anagramm einer Zeichenkette ist eine Zeichenkette mit exakt gleich vielen, identischen Zeichen in gegebenenfalls anderer Reihenfolge. Beispiel: betrug und geburt sind Anagramme voneinander. Außerdem sollen Leerzeichen ignoriert werden, so dass auch tom marvolo riddle und i am lord voldemort Anagramme voneinander sind. Klein-/Großschreibung soll hingegen berücksichtigt werden. Schreiben Sie eine Methode public static boolean anagramm(String s1, String s2), die prüft, ob die beiden Argumente Anagramme voneinander sind. Testen Sie in der main! Gehen Sie dabei wie folgt vor (und nicht anders, etwa Sortieren mit eingebauten Methoden):  Entfernen Sie zunächst alle Leerzeichen (Aufgabe 3).  Entfernen Sie nacheinander jedes Zeichen in s1 aus s2, falls s1 und s2 dieselbe Länge haben.

ich habe das Programm soweit bekommen, dass es Groß- und Kleinschreibung ignoriert leider hänge ich bei dem Punkt mit dem Leerzeichen löschen und das hat mir den Code auch total zerschossen...
Java:
public class Palindrom {
    static int counter;
    public static void main(String[] args) {
System.out.println(anagramm("tommarvoloriddle", "iamlordvoldemort"));
public static boolean anagramm( String s1, String s2) {
    String a = s1.replaceAll(" ", "");
    String b = s2.replaceAll(" ","");
    a=s1.toLowerCase().trim();
    b=s2.toLowerCase().trim();
    if( a.length() == b.length()) {
    for(int i = 0; i < a.length(); i++) {
        for( int j = 0; j < b.length(); j++) { 
        if(a.charAt(i) == b.charAt(j)) {
        counter++;
        }
        }
    }
    
    }
    if( counter == a.length()) {
        return true;
    }
    else {
        return false;
    }
    }
P.s deswegen sieht der code jetzt auch ein bisschen komisch aus, da ich sehr viel rumprobiert habe.
 
Zuletzt bearbeitet von einem Moderator:
mihe7

mihe7

dass es Groß- und Kleinschreibung ignoriert
Bist Du sicher, dass Du das willst?
Klein-/Großschreibung soll hingegen berücksichtigt werden.
Entfernen Sie zunächst alle Leerzeichen (Aufgabe 3)
Das musst Du also schon eine Aufgabe zuvor gemacht haben, oder?

Wenn Du das mit replaceAll machen willst, hast Du es im Code oben schon richtig gemacht (man könnte statt " " auch "\\s" verwenden, um sämtliche Whitespace-Character zu ersetzen). Was natürlich keinen Sinn gibt, ist erst der Variablen a den String s1 ohne Leerzeichen zuzuweisen und anschließend den Wert der Variablen a mit dem String s1 in Kleinbuchstaben zu überschreiben.
 
X

xImMonti

Das musst Du also schon eine Aufgabe zuvor gemacht haben, oder?
ja habe ich und zwar so: return resultat = resultat + s.replace( "c", "");
Was natürlich keinen Sinn gibt, ist erst der Variablen a den String s1 ohne Leerzeichen zuzuweisen und anschließend den Wert der Variablen a mit dem String s1 in Kleinbuchstaben zu überschreiben.
Ja ich weiß... das war nur zum ausprobieren aber jetzt habe ich total den überlblick verloren
 
X

xImMonti

ich glaube so sah mein code davor aus:
Java:
public static boolean anagramm( String s1, String s2) {
    //String a = s1.replaceAll(" ", "");
    //String b = s2.replaceAll(" ","");
    s1.toLowerCase().trim();
    s2.toLowerCase().trim();
    if( s1.length() == s2.length()) {
    for(int i = 0; i < s1.length(); i++) {
        for( int j = 0; j < s2.length(); j++) { 
        if(a.charAt(i) == s2.charAt(j)) {
        counter++;
        }
        }
    }
    
    }
    if( counter == s1.length()) {
        return true;
    }
    else {
        return false;
    }
    }
das auskomemntierte war nicht da
 
Zuletzt bearbeitet von einem Moderator:
J

JustNobody

Also es ist doch schon einiges vorgegeben:
Gehen Sie dabei wie folgt vor (und nicht anders, etwa Sortieren mit eingebauten Methoden):
- Entfernen Sie zunächst alle Leerzeichen (Aufgabe 3).
- Entfernen Sie nacheinander jedes Zeichen in s1 aus s2, falls s1 und s2 dieselbe Länge haben.
Also das mit den Leerzeichen hast Du schon einmal hinbekommen. Kannst du den zweiten Punkt etwas ausführlicher umschreiben?

Und ich sehe bei Dir kein Entfernen sondern nur irgendwas mit zählen - also würde ich den Teil deines Codes ggf. komplett verwerfen und mir erst einmal überlegen, was man denn machen kann um das mit dem Anagramm über Entfernen von Zeichen zu ermitteln.
 
mihe7

mihe7

Wenn Du Code postest, dann bitte in Code-Tags (die drei Punkte neben dem Smiley, dann auf Code, dort Java einstellen, Code inkl. Einrückungen in das Textfeld kopieren).

Hier erstmal der relevante Code nochmal formatiert. Die Rückgabe habe ich schon mal abgekürzt - Sinn ergibt sie aber keinen, denn warum sollte counter so lang wie s1 werden?

Java:
public static boolean anagramm( String s1, String s2) {
    String a = s1.replaceAll(" ", "");
    String b = s2.replaceAll(" ","");

    if( a.length() == b.length()) {
        for(int i = 0; i < a.length(); i++) {
            for( int j = 0; j < b.length(); j++) {
                if(a.charAt(i) == b.charAt(j)) {
                    counter++;
                }
            }
        }
    }
    return counter == s1.length();
}
EDIT: und halte Dich an das, was @JustNobody Dir vorgeschlagen hat :)
 
X

xImMonti

Das ganze war so gedacht: Die Anagramme müssen ja gleich lang sein. Deswegen habe ich einen counter eingerichtet der solange hochzählt bis es der String länge entspricht und wenn die Strings noch die gleichen Chars enthalten soll true ausgegeben werde (wegen boolean)
 
mihe7

mihe7

aaaaab bbbbba sind gleich lang und enthalten die gleichen Zeichen, nämlich a und b, sind aber keine Anagramme.
 
X

xImMonti

Habe es hinbekommen vielen vielen dank!!! hab den ganzen schrott einfach rausgeschmissen :D
Java:
public static boolean anagramm( String s1, String s2) {
    s1 = s1.replaceAll(" ", "");
    s2 = s2.replaceAll(" ","");
    s1.toLowerCase().trim();
    s2.toLowerCase().trim();
    if( s1.length() == s2.length()) {
    for(int i = 0; i < s1.length(); i++) {
        for( int j = 0; j < s2.length(); j++) {
        if(s1.charAt(i) == s2.charAt(j)) {
        return true;
        }
        }
    }
    }
    return false;
    }
 
mihe7

mihe7

Java:
    s1.toLowerCase().trim();
    s2.toLowerCase().trim();
bewirkt gar nichts.

Deine Methode liefert jetzt true, sobald ein beliebiges Zeichen aus s1 in s2 vorkommt.
 
J

JustNobody

Also dazu zwei Punkte:
a) Der Lösungsweg ist vorgegeben. Eigene Lösungswege sind daher nicht zielführend.
b) Deine Idee dürfte nicht funktionieren. Denn wenn ich es richtig sehe und der erste String "ab" ist, dann zählt er bei "aa" bis 2, was der Länge des strings entspricht. Und bei "aab" und "aab" zählt er bis 5 was nicht der Länge entspricht ....
 
X

xImMonti

Also müsste ich erstmal alle leerzeichen entfernen das habe ich verstanden. Aber wie ist das gemeint, mit dem es sollen nach und nach alle zeichen aus s1&s2 entfernt werden.
 
J

JustNobody

Was bedeutet denn Anagramm? Kannst Du das einmal erläutern? Wann sind zwei Zeichenketten ein Anagramm?
 
X

xImMonti

Sie sind ein Annagramm, wenn beide Wörte die selben Buchstaben enthalten
 
X

xImMonti

und soweit ich es gelernt habe (bin noch blutiger Anfänger) kann ich chars mit .replace entfernen oder liege ich da falsch?
 
X

xImMonti

ja sie müssen natürlich auch die gleiche Anzahl an Buchstaben + die gleiche länge
 
Thema: 

Anagramm mit Strings und Methode

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben