Comparable

  • Themenstarter Themenstarter JJ
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

JJ

Gast
Ich verstehe das Interface comparable nicht.

ich habe eine klasse Kunde mit Vorname, Nachname, PLZ etc. und möchte diese Objekte anhand ihres Nachnamens sortieren.

Ich weiß dass das interface comparable so aussieht:

Code:
public int compareTo (Object o);


Wie implementier ich das aber in der Klasse Kunde?

Code:
public int compareTo (Object o) {
             Kunde k = (Kunde) o
...


...??? und dann? und wieso kann ich nicht sagen Kunde o = new Kunde oder so?

wie mach ich klar dass ich die objekte nach nachname und nicht zb. plz sortieren will?


Für Hilfe wäre ich sehr dankbar!
 
Du castest das übergebene Objekt nach Kunde, anschließend holst du dir von diesem Objekt den Nachnamen, und vergleichst ihn mit dem lokalen Nachnamen.
Eine entsprechende Zahl zurückgeben und fertig.
 
> Kunde o = new Kunde

wenn man zwei Kunden vergleichen will, welchen Sinn hat es in dieser Situation, ein neuen Kunden zu erstellen?
das ist doch Quatsch


---------

vergleichen

Beispiel 1, sortiert nach Namen:
Code:
public int compareTo (Object o) {
        Kunde k = (Kunde) o;
  return this.getName().compareTo(k.getName());

}
sollen doch die Strings comparen

------
Beispiel 2, sortiert nach Zahl:

Code:
public int compareTo (Object o) {
        Kunde k = (Kunde) o;
  return this.getZahl() - k.getZahl();

}

denn wenn die Zahlen gleich groß sind, ist die Differenz 0,
Rückgabewert 0 heißt gleich groß

ist eine Zahl größer als die andere,
dann gibt es einen positiven oder negativen Rückgabewert,
dies entsprich größer oder kleiner
 
Hab nun folgendes Programm

Code:
public class Testprogramm {



   public static void sortiere(Comparable data[])
   {
     boolean sorted;
     do {
       sorted = true;
     for (int i = 0; i < data.length - 1; ++i) {
         if (data[i].compareTo(data[i + 1]) > 0) {
           Comparable tmp = data[i];
           data[i] = data[i + 1];
           data[i + 1] = tmp;
           sorted = false;
         }
       }
     } while (!sorted);
   }

	public static void main(String[] args)
                  {
     
     Comparable data[]  = new Comparable[5];
     
     Kunde Kunde1 = new Kunde("Schmidt", "Helmut", "Turmstraße 3", "88748 Bochum"); 
     Kunde Kunde2 = new Kunde("Berns", "Günther", "Mauerstraße 3", "98379 Köln");
     Kunde Kunde3 = new Kunde("Reiners", "Gundula", "Krauerweg 5", "93802 Mainz"); 
     Kunde Kunde4 = new Kunde("Zens", "Andrej", "Galoppring 9", "4711 Entenhausen");
     Kunde Kunde5 = new Kunde("Anders", "Wolfgang", "Schalplatz 98", "87666 Gotham City");

     
     data[0] = Kunde1;
     data[1] = Kunde2;
     data[2] = Kunde3;
     data[3] = Kunde4;
     data[4] = Kunde5;

     
     sortiere(data);
     for (int i = 0; i < data.length; ++i) {
       System.out.println(data[i]);
     }
   }
}

und folgende implementation vom interface comparable in der klasse kunde:
Code:
public int compareTo (Object o) {
		Kunde k = (Kunde) o;
		return this.Nachname.compareTo(k.Nachname);
			}

}

nach sortiere(data) bekomme ich bei der ausgabe auf dem bildschirm:

Kunde@16930e2
Kunde@108786b
Kunde@119c082
Kunde@1add2dd
Kunde@1ee36c


Wo kommen diese komischen sachen denn nun her...??

UNd wenn ich sage "System.out.println(data.Nachname);" sagt der kompiler er kann nachname nicht finden obwohl ich diese variable in der klasse kunde deklariert hab mit public.. was soll ich tun?
 
a) Woher soll denn Java wissen wie ein Kunde in ein String umgewandelt wird? :wink: Jede Klasse besitzt eine Methode "toString", per Standard ist das "Klassenname@ObjektID". Überschreib die "toString"-Methode von Kunde, wenn du eine andere Ausgabe haben willst.

b) Der data-Array beinhaltet "Comparables". Der Compiler kann nicht wissen, dass während der Laufzeit Objekte vom Typ "Kunde" gespeichert sind; dementsprechend kann er den Zugriff auf ein möglicherweise nicht vorhandenes Attribut nicht erlauben. Mach doch einen Kunde-Array.
 
Danke vielmals! , hab einfach ein kunden array gemacht und es klapt.

nur nochaml zum verständnis:

was kann ich mir unter "comparables" vorstellen und was genau leistet das interface comparable? schließlich sortier ich doch mit der methode sortiere...was wäre wenn es comparable nicht gäbe?
 
Anonymous hat gesagt.:
was kann ich mir unter "comparables" vorstellen und was genau leistet das interface comparable? schließlich sortier ich doch mit der methode sortiere...was wäre wenn es comparable nicht gäbe?
Mit dem Implementieren eines Interfaces garantierst Du, dass Deine Klasse alle Methoden implementiert, die das Interface vorschreibt. Methoden wie die Collections.sort(…) sind ja schon festgeschrieben, woher sollten sie aber wissen, wie man dieses oder jenes vegleicht? Tja, das wissen sie eben nicht, deshalb überlassen sie das Sortieren den Klassen selbst. Natürlich kann aber Collections.sort(…) nur eine Methode aufrufen, also muss es sich auch sicher sein, dass diese Methode (in unserem Fall compareTo(…)) in der Klasse existiert. Das wird eben, wie schon gesagt, durch das Interface Comparable sichergestellt: Mit der Implementierung garantierst Du, dass diese Methode auch tatsächlich existiert.

MfG
Ark
 
Danke für die erläuterungen...

eine kurze und letzte frage hätte ich noch.

Code:
public int compareTo (Object o) {
      Kunde k = (Kunde) o;
      return this.Nachname.compareTo(k.Nachname);
         }

}

warum schreibt man this.Nachname.compareTo(k.Nachname)? welche nachname wird hier mit welchem verglichen?
 
na der eigene (this) mit dem anderen (k),

genausogut kann man auch
k.Nachname.compareTo(this.Nachname);
schreiben,
wodurch dann die gesamte Sortierung umgekehrt wird
(aufsteigend <-> absteigend)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben