compareTo in Verbinug mit Arrays.sort()

  • Themenstarter Themenstarter koerschgen2001
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

koerschgen2001

Gast
Hallo erstmal,

bin ein Java Newbie und versuche gerade das mit compareTo(Object obj) zu verstehen, komme aber nicht ganz hinter die Sache.

Hier erstmal ein paar Codestücke.

Code:
// Kunde.java
public class Kunde implements Comparable {
	private String name;
	private String adresse;
	

	public Kunde(String name, String adresse) {
		this.name = name;
		this.adresse = adresse;
	}


public int compareTo(Object obj) {
		if (!(obj instanceof Kunde))
			throw new ClassCastException();
		return name.compareTo(((Kunde)obj).name);
	}

Code:
// Test.java
import java.util.*;

public class Test {
	public static void main(String[] args) {
		Kunde[] kunden = new Kunde[3];
		kunden[0] = new Kunde("Heinz Otto", "Hauptstr. 11, 12345 Entenhausen");
		kunden[1] = new Kunde("Karl Mustermann", "Hauptstr. 22, 12345 Entenhausen");
		kunden[2] = new Kunde("Günter Meier", "Traum Weg. 5, 12345 Entenhausen");

		Arrays.sort(kunden);

Ich verstehe nicht ganz was Methode compareTo macht.
So wie ich das sehe ist name z.B. Heinz Otto. ((Kunde)obj), obj steht für kunden. Nur in diesem Fall würde 0 zurückgegeben da beides, name.compareTo und (((Kunde)obj).name gleich sind.
Das würde in einer Sortierfunktion nicht viel Sinn ergeben. Was gibt "return name.compareTo(((Kunde)obj).name" zurück?

Da dieses Methode nirgendwo aufgerufen wird, muss Arrays.sort(kunden) anscheinend obj übergeben.
Aber was wird da übergeben.
Also erklärungen aus der Fachliteratur was dieses Methode macht habe ich genug gelesen. Ich bräuchte mal eine Erklärung die mir das aufschlüsselt.
 
hmm ist doch ganz einfach?

zwei Strings a="Auto", b="Zeitung" lassen sich vergleichen

a.compareTo(b) liefert was negatives und das bedeutet a ist lexikalische vor b
(geraten, was genau rauskommt siehe in die Beschreibung der Operation oder teste)


----------

bei zwei Kunden-Objekten ist das nun nicht mehr so einfach, niemand weiß wie die verglichen werden sollen,
es sei denn du implentierst compareTo und gibts darin an dass die beiden Strings vergleichen werden sollen

name.compareTo(((Kunde)obj).name)
entspricht
a.compareTo(b)

also gibt die Reihenfolge der Namen die Reihenfolge der Kunden-Objekte an, ganz einfach

------------

Arrays.sort(kunden);

ist irgendwie implementiert, Quicksort oder so, ist völlig egal,
es gilt allein: Arrays.sort(kunden); sortiert die MENGE der Kunden sofern es möglich ist, ZWEI Kunden miteinander zu vergleichen,

wenn das direkte Vergleichen erstmal geht ist es ja nur noch eine Frage eines guten Algorithmus das ganze Array zu sortieren
 
ich auch noch 🙂

compareTo sagt dem Algorithmus, welche Ordnung über den Objekten gilt. Bei Zahlen (Integer, Double usw) ist dies ja noch recht einleuchtend und logisch. Doch bei größeren Datenstrukturen natürlich bei weitem nicht.

D.h. compareTo sagt genau, ob das aktuelle Objekt größer, kleiner oder gleich dem übergebenen ist. Vor Java 1.5, also vor den Generics zeiten, musste die Methode so geschrieben werden, dass sie für alle möglichen Objekte gültig ist, also war der Parameter vom Typ Object.

Seit Java 1.5 mit den Generics, kann man sich die Sache erleichtern, in dem man den Typ selbst bestimmt
Code:
public class Kunde implements Comparable<Kunde> {
  ....

  public int compareTo(Kunde otherKunde) {
     // was auch immer
  }
}

Bei Strings ist die Ordnung die alphabetische Reihenfolge der Wörter.

Wie genau die Methode Arrays.sort implementiert ist, weiß ich nicht, ist auch im Grunde unwichtig. Bildlich kann man es sich so vorstellen, dass intern Objekte verglichen werden und aufgrund ihrer - im Comparator oder wenn sie Comparable sind - Ordnung sortiert
 
koerschgen2001 hat gesagt.:
ClassCastException();
return name.compareTo(((Kunde)obj).name);

Ich splitte diese Zeile erstmal auf:
Code:
Kunde testObject = (Kunde)obj;
String kundenName = testObject.name;
return this.name.compareTo(kundenName);

Diese Zeile macht also nichts anderes, als von Kundenobjekten die Eigenschaft name zu vergleichen. Damit gilt, dass
Heinz Otto kleiner als Karl Mustermann, aber größer als Günter Meier ist.
 
In diese Richtung habe ich auch schon gedacht, war mir aber nicht ganz sicher.

Da ich jetzt aber bestätigt bekommen habe dass das so ist, glaube ich das mal.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben