Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
13.3 compareTo
Hey,
leider sind die Vorgaben hier etwas mager…
Sind Großbuchstaben immer kleiner als Kleinbuchstaben? (Siehe char(‘a’) char(‘A’)) Oder kann die Groß und Kleinschreibung ignoriert werden? (.toLowerCase())
Soll die compareTo Methode wie die Standardimplementierungen -1 / 0 / 1 zurück geben?
Zur Aufgabenstellung allgemein… rekursiv oder iterativ?
Edit: ist der Char ’ ’ größer oder kleiner als ‘A-Za-z’?
Mit freundlichen Grüßen,
Frezy
Ein Blick in die Java API zeigt, dass es dafür eine eigene Methode gibt: String (Java Platform SE 7 ).
Die normale compareTo-Methode ist case-sensitiv.
Zur Reihenfolge: Die compareTo-Methode sortiert Zeichen nach deren ASCII-Wert (American Standard Code for Information Interchange – Wikipedia).
Also: Alle Großbuchstaben kommen vor Kleinbuchstaben.
Das ist ein Missverständnis. Die Standardimplementierungen geben 0, einen Wert <0 oder einen Wert >0 zurück, siehe: String (Java Platform SE 7 )
In der Annahme, dass du das Leerzeichen meinst: Besitzt den Hey-Wert 20 und kommt vor Großbuchstaben, siehe ASCII-Tabelle.
Ja die Docs habe ich bereits gelesen und ich weiß wie diese funktionieren.
In der Aufgabenstellung sollte man die compareTo Methode selbst implementieren.
Jetzt ist die Frage wie das ganze gemeint ist.
Ich habe den String “Nachname, Vorname”…
natürlich kann ich diesen einfach an eine Methode aus der String Klasse weiterleiten. Aber meine Frage ist ob das auch so gewollt ist.
return (“Nachname, Vorname”).compareTo(“Nachname, Vorname”) scheint mir zu einfach zu sein…
Mit freundlichen Grüßen
Klar benutzt du einfach die entsprechende Methode für Strings.
Jedoch wird dein Vorschlag nicht so ohne weiteres funktionieren ![]()
Das ganze arbeitet komplett nach ASCII-Code (http://www.asciitable.com/) => Großbuchstaben immer kleiner als Kleinbuchstaben
zieh doch einfach den anderen buchstaben von deinem buchstaben ab =>
wenn kleiner 0 ist der andere buchstabe größer => return -1
wenn > 0 ist der andere buchstabe kleiner => return 1
’ ’ kommt in einem zusammenhängend String an buchstaben eh nicht vor…ist also nicht relevant.
Wieso nicht? Hatte es so wie frezy implementiert:
…und es funktioniert wunderbar!
Wo soll der Fehler sein?
Ich verstehe schon, warum das bei euch funktioniert. Ihr nehmt an, dass jeder String zunächst aus einem Großbuchstaben besteht und dann nur Kleinbuchstaben hat. In diesem Fall funktioniert eure Methode, da Großbuchstaben genauso wie Leerzeichen kleiner als Kleinbuchstaben sind.
Die Annahme vom vorletzten Satz ist aber in Wirklichkeit nicht der Fall. Der Name “MÜLLER, MAX” muss z. B. nach “MÜLL, JOHANN” kommen, denn lexikographisch ist “MÜLL” < “MÜLLER” und somit “MÜLL~~JOHANN” < “MÜLLERMAX”, aber, wenn man diese Strings aneinander anhängt, dann stimmt das nicht mehr, denn “MÜLLJOHANN” > “MÜLLERMAX”. Die Aussage von Jackpot ist somit korrekt.
edit: Sämtliche Namen sind frei erfunden und Analogien zu realen Menschen sind nicht beabsichtigt.
Vielen Dank Chayyam! Das klingt für mich Plausibel, aber in der Aufgabenstellung steht:
edit: D.h., dass „Müller, Max“ und „Müll, Johann“ erst gar nicht verglichen werden, da „Müll“ vor „Müller“ kommt und somit nicht weiter verglichen wird.
@ mamiu:
Du hast die Aufgabenstellung schon richtig verstanden und ich meinte eig. dasselbe. Was ich befürchtet habe, war aber, dass jemand so etwas implementiert wie:
public int compareTo(String vorname1, String nachname1, String vorname2, String nachname2){
String a = nachname1 + vorname1;
String b = nachname2 + vorname2;
return a.compareTo(b);
}
Korrekt ist aber, “MÜLL” und “MÜLLER” zu vergleichen und (nur) im Gleichheitsfall die Vornamen zu beachten.
elegante Lösung wäre wahrscheinlich gewesen:
public int compareTo(NameEntry other) {
if (this.surname.compareTo(other.surname) != 0) {
return this.surname.compareTo(other.surname);
}
return this.firstName.compareTo(other.firstName);
}
Damit wertest du [m]surname.compareTo(other.surname)[/m] doppelt aus. Besser:
public int compareTo(NameEntry other) {
int surnameResult = surname.compareTo(other.surname);
if (surnameResult != 0) {
return surnameResult;
}
return firstname.compareTo(other.firstname);
}
ja, ok ![]()
wäre ja auch zu schön gewesen, wenn ich mal eine perfekte Lösung hätte