OOP Testen ob 2 Strings gleich sind

pinkrocker

Mitglied
Hallo,
ich würde gerne testen, ob 2 Strings genau gleich sind und zwar ohne .sort zu verwenden.
Hier mal mein Code:

Java:
	private static boolean areAnagrams(String a, String b) {
		if(a.length() != b.length())
			  return false;
		char [] newA = new char [a.length()];
		char [] newB = new char [b.length()];
		for (int i = 0; i < a.length(); i++) {
			newA [i] = a.charAt(i);
			newB [i] = b.charAt(i);
		}
		for (int i = 0; i < a.length(); i++) {
			for (int j = 0; j < a.length(); j++) {
				if (newA [j] < newA [i]) {
					newA [i] = newA [j];
				}
			}
			for (int j = 0; j < b.length(); j++) {
				if (newB [j] < newB [i]) {
					newB [i] = newB [j];
				}
			}
		}
		if (newA.equals(newB)) {
			return true;
		}

		return false;
	}

ich weiß nicht genau wo mein Fehler liegt.
Prinzipiell müssten doch die einzelnen character in meinem char[] array geordnet gespeichert werden oder?

pinkrocker
 
Nur anhand des Methodennamens kann man überhaupt erahnen, was du eigentlich vorhast 😱

Ich würde eine Art "BucketSort" vorschlagen. Durchlaufe einmal den ersten Sting und zähle dabei alle a's, alle b's ... dann beim zweiten das gleiche. Anschließend musst du nur deine Zählerstände vergleichen. so läuft dein Algorithmus insgesamt sogar in linearer zeit.
 
Wie wäre ein ganz anderer Ansatz

Hole dir den ersten Buchstaben des ersten Strings. Gehe nun durch den zweiten String. Findest du den Buchstaben nicht -> Return false. Findest du ihn, dann setzt du den Wert des Char im zweiten String auf 0 und -> Break; dann nächsten Buchstaben aus ersten String. Das ganze bis du durch den ersten string durch bist. Nun muss der gesamte zweite string nur noch aus 0 bestehen oder -> return false.

Gruss

Claus
 
Nur anhand des Methodennamens kann man überhaupt erahnen, was du eigentlich vorhast 😱

Ich würde eine Art "BucketSort" vorschlagen. Durchlaufe einmal den ersten Sting und zähle dabei alle a's, alle b's ... dann beim zweiten das gleiche. Anschließend musst du nur deine Zählerstände vergleichen. so läuft dein Algorithmus insgesamt sogar in linearer zeit.

ok, tut mir leid, war wirklich falsch formuliert.
Ich probier das mal so.
 
Java:
	private static boolean areAnagrams(String a, String b) {

Immer erst mal suchen, ob das nicht schon jemand gemacht hat.

Java:
new StringBuilder(a).reverse().toString().equals(b);

In den aller seltensten Fällen steht man vor einer Aufgabe, die nicht schon jemand anders vor einem gelöst hat.
 
Immer erst mal suchen, ob das nicht schon jemand gemacht hat.

Java:
new StringBuilder(a).reverse().toString().equals(b);

In den aller seltensten Fällen steht man vor einer Aufgabe, die nicht schon jemand anders vor einem gelöst hat.

Er will feststellen ob string b ein anagramm von string a ist und nicht ob string a rückwärts gelesen string b ergibt.

Gruss

Claus
 
Zuletzt bearbeitet:
Also da das Thema - trotz schon funktionierenden Lösungen - noch nicht beendet ist gehe ich davon aus, dass du auch wissen willst "wo genau dein Fehler liegt".

Hier liegt ein Fehler (meiner Meinung nach der einzige):
Java:
        for (int i = 0; i < a.length(); i++) {
            for (int j = 0; j < a.length(); j++) {
                if (newA [j] < newA [i]) {
                    newA [i] = newA [j]; // Hier wird newA[i] überschrieben und geht verloren, es wird nirgendwo mehr gespeichert, es wird nicht an eine Andere stelle gelegt.
                }
            }
            for (int j = 0; j < b.length(); j++) {
                if (newB [j] < newB [i]) {
                    newB [i] = newB [j];
                }
            }
        }

Bei newB ist es natürlich genauso!

Beheben musst du den Fehler selbst.
 

Neue Themen


Zurück
Oben