Sortier alternativen mit der compareTo Methode?

julia_76

Mitglied
Hallo,

ich habe folgendes Problem beim Sortieren eines Arrays. Ich möchte das Array nach der natürlichen Reihenfolge sortieren und wahlweise eine alternative sortierung wählen.

Ich habe das Array zu beginn mit der Collection.sort sortiert. Dies funktionierte ohne Probleme. Dann habe ich eine campareTo Methode angelegt, in der ich sage das er nach einem anderen Attribut sortieren soll. Jetzt wird aber immer nach dem festgelegten Attribut sortiert.
Wie ist es möglich mehrere sortier Reihenfolge zu benutzen.

im Code sieht das so aus.

Java:
final static List<Contact> result = new ArrayList<Contact>();

Java:
@Override
	public int compareTo(Contact o) {
		
		return getSurname().compareTo(o.getSurname());
	}

Java:
class ContactNameComparator implements Comparator<Contact> {
		
	    public int compare(Contact contact1, Contact contact2) {
	        return contact1.getSurname().compareTo(contact2.getSurname());
	    }
	}

Java:
public void selectetAddressSourceList(){
		
		parseSelectetdAddressProvider();
		Collections.sort(result);
		doubleEntryClean(result);
		printAdressBook(result);
		
		return;
	}

Gruß,
 
Du sortierst in beiden Varianten nach dem Attribut, das dir getSurname() liefert und nutzt dazu (vermutlich) implizit die Implementierung die aus java.lang.String stammt.

Wieso genau erwartest du jetzt unterschiedliche Ergebnisse ?
 
und genau das ist ja meine Frage. Durch die Methode compareTo überschreibe ich die natürliche Sortierung, und sortiere nach getSurname. Ich möchte das "result" Array jedoch auf zwei Arten sortieren.

1. nach der natürlichen Sortierung.
2. über die Methode"compareTo" getSurname.

Jetzt ist die Frage wie kann ich die natürliche Sortierung anwenden. An irgend einer Stelle, muss ich dann doch eine Fallunterscheidung einbauen, wo ich sagen kann nach welchem kriterium (natürlich oder getSurname) Sortiert werden muss.

Gruß
 
Du hast uns zwar die Deklaration von Contact verschwiegen, aber ich vermute mal, das Contact das interface Comparable<Contact> implementiert. In diesem Fall ist die natürliche Sortierung durch die Implementierung von compareTo festgelegt. Und diese hast du selbst so festgelegt, dass nach surname sortiert wird.
Oder kurz gesagt: Die Sortierung nach surname ist die natürliche Sortierung, weil du sie so festgelegt hast. Du hast nix "überschrieben". Wenn du zwischen verschiedenen Sortierungen umschalten wilst, könntest du einfach verschiedene Comparatoren schreiben.
 
Zuletzt bearbeitet:
Erst einmal danke für die Erklärung.
Sorry das ich die Implementierung verschwiegen habe.

Von der Erklärung her habe ich das verstanden. Der Angelegte Comparator mit der compareTo Methode stellt aktuell meine natürliche suche dar. So weit Ok.
Ich verstehe auch das ich für jedes weiter Suchkriterium einen weiteren Comperator schreiben muss (habe ich getan "class ContactTelephoneNumberComparator implements Comparator<Contact>"). Beide Comperatoren sind bei mir in je einer innere Klassen zusammengefasst.

Java:
class ContactNameComparator implements Comparator<Contact> {
		
	    public int compare(Contact contact1, Contact contact2) {
	        return contact1.getSurname().compareTo(contact2.getSurname());
	    }
	}
	
	class ContactTelephoneNumberComparator implements Comparator<Contact> {
		
	    public int compare(Contact contact1, Contact contact2) {
	        return contact1.getTelephoneNumber().compareTo(contact2.getTelephoneNumber());
	    }
	}

Was mir jetzt immer noch nicht klar ist, wie es an dieser Stelle weitergeht.
Ich verstehe das jetzt so, das ich später beim aufruf der Methode sort() eine gewünschte Sortierung aufrufen muss. Aber dieses aufrufen und das Zusammenspiel mit der compareTo methode in der Klasse Contact erschließt sich mir noch nicht.
Über weitere hilfe wäre ich dankbar.

Der Aufruf ein der sort() Methode stelle ich mir dann in etwa so vor.

Java:
Collections.sort(result,  (aufruf comparator) );

Gruß
 
Heute Mittag ist dann der Groschen gefallen. Im Prinzip war ja schon alles erledigt. Es hat lediglich nur noch diese zeile gefehlt.

Java:
Collections.sort(result, new ContactNameComparator());

Dennoch danke für die Hilfe und erklärungen.

Gruß
 

Zurück
Oben