Comparable interface

akvarel

Mitglied
Hallo!
Ich hab ein kleines Problem mit Verstehen von Comparable( und ähnliche Sachen=) ).
Und zwar mit dieser Code , Classe Lampe.
http://www.java-forum.org/allgemeines/39510-arrays-listen-sortieren.html

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?

In deisem Beispiel unten Java Comparable Example | Java Tutorials and Examples
habe ich alles vertsande, weil da die if-statement gibt...
 

Noctarius

Top Contributor
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 :)
 
N

nillehammer

Gast
Der Methode public int compareTo( Lampe argument ) {..} wird niergenwo angewendet,
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.
Nein, die Methode wird erst aufgerufen, wenn sie gebraucht wird. Also z.B. beim Sortieren von Elementen.
angelegt sind, wird compareTo ausgeführt und als return bekommen wir 1 ,also 6600>730 aber wo werden diese Zahlen sortiert?
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.
 
Zuletzt bearbeitet von einem Moderator:

akvarel

Mitglied
Nein, die Methode wird erst aufgerufen, wenn sie gebraucht wird. Also z.B. beim Sortieren von Elementen.
also, wenn ich sort-Methode aufrufe, dann wird wie Kettereaktion auch compareTo aufgerufen.

was ist aber mit toString-Methode?

Java:
public class Book implements Comparable<Book> {
    private String title;
    private int    isbn;

    Book(String title, int isbn) {
        this.title = title;
        this.isbn  = isbn;
    }

    public int compareTo(Book object) {
       
        if (title.equals(object.title)) {
            if (isbn>object.isbn)
            {return 1;}
            else return -1;
        }
        else return title.compareTo(object.title);
    }
    public String toString() {
        return title + " (" + isbn + " Isbn)";
    }
}

import java.util.*;

public class TestCollections {
    public static void main(String[] args) {
    	 Book[] books = {
    		        new Book("Würzburger Hofbräu", 75757557),
    		        new Book("Becks", 123),
    		        new Book("Paulaner", 6544),
    		        new Book("Distelhäuser", 8765) };

        Arrays.sort(books);
        for (Book bier : books) {
            System.out.println(bier);

        }}}

Ohne toString-Methode, die Ausgabe ist total falsch. Wird toString auch automatisch ausgeführt wenn ich System.out.println-Methode aufrufe?

Und wenn ja, wo kann ich finden welche Methoden automatisch ausgeführt werden, damit ich die umschreibe oder muss ich einfach logisch denken?=))
 

SamHotte

Top Contributor
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.
 
S

SlaterB

Gast
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:
    public String toString()
    {
        // evtl. mit weiteren Infos wie Name des aktuellen Objektes usw., 
        // Vorsicht vor Endlosrekursion etwa wenn hier zur Ausgabe nochmal toString() aufgerufen wird..
        new Error("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
 

Noctarius

Top Contributor
In Java 6 kannst du dir doch auch den aktuellen Stacktrace einfach ausgeben lassen, ohne gleich einen Error zu erzwingen (find ich irgendwie ... naja ^^)

Java:
Thread.currentThread().dumpStack();
 

akvarel

Mitglied
ok... und ich habe noch eine kleine frage.

Das ist ein Abschnitt der Programme.(die ganze Programme ist unten hier Java Blog Buch : D) Objekte sortieren – Comparator und Comparable)

Java:
import java.util.Comparator;
 
public class BierComparator implements Comparator<Bier> {
 
  @Override
  public int compare(Bier b1, Bier b2) {
 
    if (b1.getInhalt() == b2.getInhalt()) {
      if (b1.getHerkunft().compareTo(b2.getHerkunft()) == 0) {
        return b1.getName().compareTo(b2.getName());
      }
      else {
        return b1.getHerkunft().compareTo(b2.getHerkunft());
      }
    }
    else if (b1.getInhalt() > b2.getInhalt()) {
      return -1;
    }
    else {
      return 1;
    }
  }
}

Wieso darf ich compareTo benutzen ohne Comparable Interface importiert zu haben?

Comparator Interface hat doch keine compareTo-Methode.
 

SamHotte

Top Contributor
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.

/edit: soo langsam, vermutlich die Hitze ;-)
 
S

SlaterB

Gast
In Java 6 kannst du dir doch auch den aktuellen Stacktrace einfach ausgeben lassen, ohne gleich einen Error zu erzwingen (find ich irgendwie ... naja ^^)

Java:
Thread.currentThread().dumpStack();

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()
     */
    public static void dumpStack() {
	new Exception("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();
;)
 
Zuletzt bearbeitet von einem Moderator:

Landei

Top Contributor
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:
public class BierComparator implements Comparator<Bier> {

        @Override
        public int compare(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;     
        }
}

Alternativ dazu gibt es CompareToBuilder (Commons Lang 2.5 API)
 
S

SlaterB

Gast
die Fehlermeldung kann gar nicht kommen,
richtig ist aber dass es besser Float.valueOf() heißen sollte bei float-Werten
 

Landei

Top Contributor
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.
 

akvarel

Mitglied
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?
 

Landei

Top Contributor
Dann halt...
Java:
int result = Float.valueOf(b1.getInhalt()).compareTo(Float.valueOf(b2.getInhalt()));

Aber Java 1.4 ist nun wirklich hornalt...
 
S

SlaterB

Gast
Ich wollte nur wissen wieso muss man noch zusatzlichen Integer.valueOf hinzufügen,
warum schreibst du eigentlich nicht gleich eine verständliche Frage?

ohne es bekomme ich die Fehlermeldung Cannot invoke compareTo(float) on the primitive type float.
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)
 
Zuletzt bearbeitet von einem Moderator:

akvarel

Mitglied
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.

Ist das richtig?
 

akvarel

Mitglied

Danke=)


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?


Java:
import java.org.apache.commons.lang.builder.CompareToBuilder;

public class Fruit {
	String name;
	String colour;
   public Fruit(String name, String colour){
	   
	   this.name=name;
	   this.colour=colour;
	   
   }
	public void setName(String name){
		this.name=name;
		
	}
	public String getName(){
	return this.name;
	}

	public void setColour(String colour){
		this.colour=colour;
		
	}
	public String getColour(){
	return this.colour;
	}
	
	public int compareTo(Object o ){
		Fruit i= (Fruit) o;
		return new CompareToBuilder()
		    .append(this.name, i.name)
		    .append(this.colour, i.colour)
		    .toComparison();
	}
}
 
S

SlaterB

Gast
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
Shizmo Frage zu Comparable Java Basics - Anfänger-Themen 4
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
B Comparable & Comparator Java Basics - Anfänger-Themen 9
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
P Comparable und Generics Java Basics - Anfänger-Themen 6
S comparable und equals Java Basics - Anfänger-Themen 7
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
S Comparable Java Basics - Anfänger-Themen 4
H Comparable und Comparator Java Basics - Anfänger-Themen 22
S instanceof Comparable...geht nicht? Java Basics - Anfänger-Themen 20
M comparable funktion & reverse funktion Java Basics - Anfänger-Themen 8
H Mehrere Comparable Java Basics - Anfänger-Themen 4
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
D Comparable - Bucketsort / Radixsort? Java Basics - Anfänger-Themen 2
B Mehrere Werte mit Comparable sortieren Java Basics - Anfänger-Themen 14
S String umwandeln in Comparable Java Basics - Anfänger-Themen 6
J Comparable Java Basics - Anfänger-Themen 9
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben