# Interface Comparable



## Aibo (8. Aug 2012)

Hallo liebes Java-Forum,

ich möchte besonders den Anfängern das Interface Comparable näher erläutern. Dazu habe ich eine Beispielklasse erstellt und diese sehr einfach gehalten. Das Interface bietet sehr viel mehr Möglichkeiten als hier besprochen wird. 

Das *Interface Comparable* (aus dem Paket java.lang) dient dazu, Objekte miteinander zu vergleichen und ist folgendermaßen aufgebaut.


```
public interface Comparable
{
public int compareTo(Object o);
}
```

Dieses Interface kann von Klassen implementiert werden, deren Objekte paarweise vergleichbar sind.

Die Methode compareTo(Object o) liefert einen int-Wert (Integer) zurück. Dieser Integer kann drei Werte beschreiben.

1. Rückgabewert: kleiner 0 wenn das Objekt "kleiner" ist.
2. Rückgabewert: größer 0 wenn das Objekt "größer" ist.
3. Rückgabewert: gleich 0 wenn das Objekt gleich ist.

Nicht schlimm wenn ihr es bis hier noch nicht ganz versteht. Ich möchte das Verständnis mit folgendem Beispiel vervollständigen. 

*Beispiel:*


```
public class InterfaceProgram implements Comparable
{
	public  int value1;
	public  int value2 = 20;

	public InterfaceProgram(int value1)
	{
		this.value1 = value1;
	}


	public int compareTo(Object o)
	{
		if( ((InterfaceProgram)o).value1 > value2) // Das Objekt muss einem Casting unterlaufen,
		{										   // damit o auf die Instanzvariablen der Klasse "InterfaceProgram" zugreifen kann.
			System.out.println("Objektvariable ist groesser!");
			return 1;
		}
		else if(((InterfaceProgram)o).value1 < value2)
		{
			System.out.println("Objekvariable ist kleiner!");
			return -1;
		}
		else
		{
			System.out.println("Objektvariable ist gleich gross!");
			return 0;
		}

	}

	public static void main(String[] args)
	{
		InterfaceProgram demo = new InterfaceProgram(10);
		System.out.println(demo.compareTo(demo) ); // Ausgabe: Objektvariable ist kleiner
												   //          -1

		demo.value1 = 20;
		System.out.println(demo.compareTo(demo) ); // Ausgabe: Objektvariable ist gleich gross
												   //   	    0

		demo.value1 = 30;
		System.out.println(demo.compareTo(demo) );// Ausgabe: Objektvariable ist groesser
												   //   	    1
	}
}
```

Vielleicht ist es noch etwas schwierig nachzuvollziehen besonders für Anfänger. Deshalb könnte vielleicht folgende Übung helfen dieses Konzept besser zu verstehen. 

*Übung:*

Erstelle eine Klasse Computer, welches das Interface Comparable implementiert. 
In dieser Klasse sollen zwei Eigenschaften enthalten sein: "hersteller", "arbeitsspeicher".
Vergleicht beide Computer-Objekte auf den "arbeitsspeicher" und entscheidet was passieren soll, wenn ein Computer-Objekt einen größeren Arbeitsspeicher enthält als das zu vergleichende Objekt.
Experementiert viel mit dem Code herum und implementiert ggf. ein weiteres interface welches den "hersteller" der Computer-Objekte zurückgibt.


----------



## xehpuk (8. Aug 2012)

Generics?
Comparable sieht so aus:

```
public interface Comparable<T> {
	int compareTo(T o);
}
```

Dein Beispiel ist leider sehr schlecht. Wenn man ein Objekt mit sich selbst vergleicht, sollte immer 0 herauskommen. Man vergleicht auch nicht unterschiedliche Instanzvariablen miteinander.


----------



## tribalup (8. Aug 2012)

xehpuk hat gesagt.:


> Dein Beispiel ist leider sehr schlecht. Wenn man ein Objekt mit sich selbst vergleicht, sollte immer 0 herauskommen.[/list]



Das tut es bei ihm auch oder ?


----------



## Landei (8. Aug 2012)

Welche Java-Version verwendest du? 1.4?

Seit der Einführung von Generics ist Comparable so definiert: 


```
public interface Comparable<T> {
   public int compareTo(T o);
}
```

Comparable (Java Platform SE 7 )

Dabei ist der generische Parameter _in diesem Fall_ fast immer die "eigene", implementierende Klasse (eine der wenigen Ausnahmen wäre [c]class java.sql.Timesstamp implements Comparable<java.util.Date>[/c]). Ist auch logisch: Wer will schon Äpfel mit Birnen vergleichen?


----------



## maki (8. Aug 2012)

IMHO fehlt da noch equals und hashcode.


----------



## tribalup (8. Aug 2012)

Nun zerpflückt ihn nicht er wollte nur einen kleinen Einstieg geben.


----------



## xehpuk (8. Aug 2012)

tribalup hat gesagt.:


> Das tut es bei ihm auch oder ?


Nein.



tribalup hat gesagt.:


> Nun zerpflückt ihn nicht er wollte nur einen kleinen Einstieg geben.


Dann aber bitte einen kleinen und richtigen Einstieg. Ich habe lieber gar keinen Einstieg als einen falschen.


----------



## tribalup (8. Aug 2012)

xehpuk hat gesagt.:


> Nein.
> 
> 
> Dann aber bitte einen kleinen und richtigen Einstieg. Ich habe lieber gar keinen Einstieg als einen falschen.



Ah nun hab ichs lölz. 
<- der braucht nen Kaffee jetzt


----------



## tuttle64 (9. Aug 2012)

Die Interfaces Comparable und Comparator werden üblicherweise verwendet um eine collection nach eigenen Attributen zu sortieren.


----------

