Comparator

Status
Nicht offen für weitere Antworten.

LoN_Nemesis

Bekanntes Mitglied
Hallo,

ich habe eine Frage:

Ich habe eine ziemlich grosse Klasse mit sehr vielen verschiedenen Integer Werten. Nun möchte ich mehrere Instanzen dieser Klasse in eine Liste packen und danach nach einem der Integer Werte sortieren lassen. Aus der Doku entnehme ich, dass ich dazu java.lang.Comparator implementieren muss. Nur wenn ich meine Klasse dieses Interface implementieren lasse, dann kann ich in der compare(Obj arg0, Obj arg1) Methode nur ein Kriterium benutzen um zu bestimmen ob ein Element grösser als das andere ist. Wie mache ich das, wenn ich verschiedene Sortierkriterien einführen will?
 
LoN_Nemesis hat gesagt.:
Hallo,

ich habe eine Frage:

Ich habe eine ziemlich grosse Klasse mit sehr vielen verschiedenen Integer Werten. Nun möchte ich mehrere Instanzen dieser Klasse in eine Liste packen und danach nach einem der Integer Werte sortieren lassen. Aus der Doku entnehme ich, dass ich dazu java.lang.Comparator implementieren muss. Nur wenn ich meine Klasse dieses Interface implementieren lasse, dann kann ich in der compare(Obj arg0, Obj arg1) Methode nur ein Kriterium benutzen um zu bestimmen ob ein Element grösser als das andere ist. Wie mache ich das, wenn ich verschiedene Sortierkriterien einführen will?


meine idee:

da ich befürchte das es mit überladen dieser Methode nicht klappt kannst du einfach eine zusätzliche Instanzvariable erstellen, welche das Suchkriterium repräsentiert.

bevor nun ein vergleich durchgeführt wird setzt du diese Variable entsprechend und in der compareTo funktion fragst du diese variable ab und führst enstprechende berechnungen durch...

nur so ne idee...

mfg
 
Ok ich habe eine bessere Lösung gefunden. Und zwar implementiert meine Klasse selbst nicht comparator, sondern ich mache eine kleine Hilfsklasse, die Comparator implementiert. Diese übergebe ich dann der Sort() Methode von Collections als zweitens Argument.

Also so sieht meine Hilfsklasse aus (Mobile ist meine eigene Klasse mit den vielen Integer Werten):

Code:
class SortBySpeed implements Comparator{

	public int compare(Object arg0, Object arg1) {
		Mobile mob1 = (Mobile)arg0;
		Mobile mob2 = (Mobile)arg0;
		return mob1.getSpeed() - mob2.getSpeed();
	}	
}

Der Methodenaufruf sieht dann so aus (mobiles ist meine Liste welche mehrere Mobile Objekte beeinhaltet):

Code:
public void sortBySpeed() {
		Collections.sort(mobiles, new SortBySpeed());
}


Analog kann ich mir für jedes gewünschte Sortierkriterium eine kleine eigene Klasse schreiben. Vielleicht hilft es ja wem, der ein ähnliches Problem hat.
 
Genauso funktioniert das mit den Comparatoren.

Jedoch sollte man noch eine Überprüfung auf den Cast machen, wie man dies macht liegt dann wieder ganz daran, mit welcher Java-Version man arbeitet.

Java < 1.5
Code:
class SortBySpeed implements Comparator{

   public int compare(Object arg0, Object arg1) {
      if (!(arg0 instanceof Mobile && arg1 instanceof Mobile)) throw new ClassCastException();
      Mobile mob1 = (Mobile)arg0;
      Mobile mob2 = (Mobile)arg1;
      return mob1.getSpeed() - mob2.getSpeed();
   }   
}

Java 1.5
Code:
class SortBySpeed<M1 extends Mobile, M2 extends Mobile> implements Comparator{

   public int compare(M1 arg0, M2 arg1) {
      Mobile mob1 = arg0;
      Mobile mob2 = arg1;
      return mob1.getSpeed() - mob2.getSpeed();
   }   
}
Ich habe das mit den Generic-Schablonen auch noch nicht so oft in Java gemacht, aber so in etwa sollte das funktionieren.
 
Sorry, war nicht angemeldet, aber Gast war in dem Fall ich. Wenns geht, bitte das Post hier hinein editieren, und das Post von Gast löschen. Danke. Wenn nicht - auch gut.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben