Der Methode public int compareTo( Lampe argument ) {..} wird niergenwo angewendet, aber ohne diese Methode werden die Arrays nicht sortiert. Ich gehe davon aus, dass jedes Mal, wenn die neue Lampe erzuegt wird, wird der Methode compareTo ausgeführt.
Ich verstehe, dass wenn
...
new Lampe( "Halogenmetalldampflampe", 6600 ),
new Lampe( "Gewöhnlich 60W", 730 )
...
angelegt sind, wird compareTo ausgeführt und als return bekommen wir 1 ,also 6600>730 aber wo werden diese Zahlen sortiert? nicht im sort-Methode, weil ohne compareTo, funktioniert sort-Methode nicht. Wie werden dann Arrays in compareTo sortiert? Wie ich verstanden habe, compareTo teilt dem sort-Methode nur mit, welche Zahl grösser ist, und dann werden die sortiert?
Nein die Methode wird aufgerufen, wenn du das Array sortieren lässt (bzw je nach Implementierung automatisch sortiert wird). Setz einfach mal einen Breakpoint und lass das Programm im Debugmodus laufen, dass siehst du, dass die Methode aufgerufen wird
Doch Arrays.sort ruft intern beim Iterieren über die Elemente die compareTo Methoden Deiner Elemente auf. Das gleiche machen SortedSets beim adden von Elementen. Die Methode wird also schon aufgerufen. Du siehst es nur nicht, weil Du die Methoden einfach benutzt, ohne Dir den Quellcode anzuschauen (musst Du ja auch nicht, es funktioniert ja).
. Ich gehe davon aus, dass jedes Mal, wenn die neue Lampe erzuegt wird, wird der Methode compareTo ausgeführt.
Die Zahlen ansich werden nicht sortiert. Die Zahlen sind das Sortierkriterium, dass benutzt wird, um zu bestimmen, welche Lampe vor oder nach welcher anderen Lampe sortiert werden soll.
Logisches Denken ist beim Programmieren nie verkehrt ;-)
Die toString()-Methode hat mit der compareTo()-Methode nicht das geringste zu tun. Sie ist in der Klasse java.lang.Object implementiert (somit hat jede Klasse eine solche Methode). Wenn sie aber nicht überschrieben wird, sieht die Ausgabe meist aus wie aörgböabguab@wrzlbrmpf - das ist vermutlich eine Repräsentation der Referenz auf das Objekt.
Daher sollte man, wenn man eine schöne Ausgabe auf Syso oder in einer JList haben möchte, immer die toString()-Methode mit etwas sinnvollem überschreiben.
generell ist das im Voraus kaum zu bestimmen,
dass bei Ausgabe toString() drankommt und bei Sortierung hoffentlich die dafür vorgesehene compareTo-Methode,
dass muss man mit Logik und Erfahrung wissen, ja,
eine kleine Hilfe zur Laufzeit, zum Ausprobieren, überall verwendbar, vergleichbar mit Breakpoint in Debugger:
Java:
publicStringtoString(){// evtl. mit weiteren Infos wie Name des aktuellen Objektes usw., // Vorsicht vor Endlosrekursion etwa wenn hier zur Ausgabe nochmal toString() aufgerufen wird..newError("toString kommt dran").printStackTrace(System.out);return title +" ("+ isbn +" Isbn)";}
->
Code:
java.lang.Error: toString kommt dran
at test.Book.toString(Test.java:71) // deine Klasse kommt dran
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.print(Unknown Source) // intere Aufrufe von println()
at java.io.PrintStream.println(Unknown Source) // System.out.println()
at test.Test.main(Test.java:33) // bei mir testweise eine andere main-Klasse
In Java 6 kannst du dir doch auch den aktuellen Stacktrace einfach ausgeben lassen, ohne gleich einen Error zu erzwingen (find ich irgendwie ... naja ^^)
Die in Deinem Beispiel benutzten compareTo()-Methoden sind Methoden der Klasse String, welches der Typ von Bier.getName() bzw. Bier.getHerkunft() ist. Der Comparator benutzt diese vorhandenen Methoden einfach mit, um nacheinander auf Inhalt, Herkunft und Name zu vergleichen.
In Java 6 kannst du dir doch auch den aktuellen Stacktrace einfach ausgeben lassen, ohne gleich einen Error zu erzwingen (find ich irgendwie ... naja ^^)
und die Implementierung dessen (zumindest bei mir mal eben im Quellcode nachgeschaut, welche Version auch immer)
Java:
/**
* Prints a stack trace of the current thread. This method is used
* only for debugging.
*
* @see java.lang.Throwable#printStackTrace()
*/publicstaticvoiddumpStack(){newException("Stack trace").printStackTrace();}
das ganze an System.out statt System.err zu übergeben finde ich Jahr für Jahr zunehmend sinnvoller,
weil sonst alles mit den normalen Ausgaben durcheinandergerät
bei häufiger Verwendung kann man sich natürlich eine Hilfsmethode deklarieren,
Helper.stack(),
noch kürzer als
Thread.currentThread().dumpStack();
Das Beispiel ist total doof geschrieben, die verschachtelten [c]ifs[/c] sind extrem unübersichtlich, insbesondere für ein Lehrbuch. Ich würde sowas schreiben:
Java:
publicclassBierComparatorimplementsComparator<Bier>{@Overridepublicintcompare(Bier b1,Bier b2){int result =Integer.valueOf(b1.getInhalt()).compareTo(b2.getInhalt());if(result ==0){
result = b1.getHerkunft().compareTo(b2.getHerkunft());}if(result ==0){
result = b1.getName().compareTo(b2.getName());}return result;}}
Woher soll ich wissen, wie du den Inhalt von deinem Bier misst? Von deinem Beispiel her konnte ich nur sehen, dass es irgendein primitiver Typ war . Wenn es Float ist, dann nimm Slater's Version.
Woher soll ich wissen, wie du den Inhalt von deinem Bier misst? Von deinem Beispiel her konnte ich nur sehen, dass es irgendein primitiver Typ war . Wenn es Float ist, dann nimm Slater's Version.
Ich wollte nur wissen wieso muss man noch zusatzlichen Integer.valueOf hinzufügen, ohne es bekomme ich die Fehlermeldung Cannot invoke compareTo(float) on the primitive type float.
Wir konvertieren einen float als primitiver Typ zu einem Float Object?
Skandal, wieso hast du diese Fehlermeldung vorhin direkt unter Code mit Integer.valueOf() geschrieben?
deswegen habe ich ja geantwortet, dass die Fehlermeldung unmöglich passt,
du kannst doch nicht einen Code x zitieren, und dazu die Fehlermeldung zu komplett anderen nicht genannten Code y posten?!
Wir konvertieren einen float als primitiver Typ zu einem Float Object?
habe ich vollständig beanwortet, Landei ebenfalls auf meine Lösung hingewiesen?!
(edit: falls das eine Frage mit 'Wie' statt 'Wir' und weiteren Satzumbau war)
habe ich vollständig beanwortet, Landei ebenfalls auf meine Lösung hingewiesen?!
(edit: falls das eine Frage mit 'Wie' statt 'Wir' und weiteren Satzumbau war)
Ihr beide habt nur die Codes geschrieben. Ich habe gefragt, ob valueOf einen primitiven Typ zu einem Object umwandelt.
Wenn ich es so habe
Java:
int result=b1.getInhalt().compareTo(b2.getInhalt())
dann bekomme ich eine Fehlermeldung :Cannot invoke compareTo(float) on the primitive type float
Das bedeutet compareTo funktioniert nicht mir den primitiven Typen.
Und man konvektiert primitive Typen indem man valueOf - methode benutzt.
Und ich habe noch eine Frage, wenn wir schon dabei sind=)
Bei
import java.org.apache.commons.lang.builder.CompareToBuilder;
sagt mir Eclipse "The import java.org cannot be resolved to a variable" und
bei
return new CompareToBuilder()
CompareToBuilder cannot be resolved to a type.
Wieso bekomme ich diese Fehler?
zu allererst weil es
> java.org.apache.commons.lang.builder.CompareToBuilder
gar nicht gibt, hast du dir das zurechtkopiert?
korrekt heißt es
> org.apache.commons.lang.builder.CompareToBuilder
wann immer org auftritt, wird es sicherlich das oberste package sein
und an einem org statt java ganz vorne kann man sich ziemlich sicher sein, dass das keine Klasse aus der Standard-Bibliothek ist,
> org.apache.commons.lang.builder.CompareToBuilder
wird also in deinem Programm auch nicht funktionieren, da musst du erst die Common-Library downloaden
bei deinem Kenntnisstand rate ich dringend davon ab, dann doch lieber 5 Code-Zeilen mehr,
die für einen Anfänger auch viel mehr Lerneffekt bringen als irgendwelche fertigen Tools,
vergleiche Taschenrechner vs. Kopf- + Papierrechnen in der Schule