Objekte sortieren mit Comparable

f4814n

Mitglied
Hi,

zunächst, ja, ich habe gesehen, dass es hier Threads zu dem thema gibt jedoch hab ich es dennoch nicht ganz gecheckt und erbitte hiermit höflich Sonderbehandlung ;-)

Folgendes Problem:
Ich habe eine ArrayList<Clothing>. Clothing hat die Attributen Price, Type (String)...
Meine Aufgabe ist es, die Objekte nach ihren Namen (Type) zu sortieren. Offenbar brauche ich dazu einen Comparator oder Ähnliches. Leider hab ich damit NULL Erfahrung und kann das, was ich im Interent dazu gelesen habe nicht richtig adaptieren. So sieht das bisher aus (clothes ist der Name der ArrayList<Clothing>) :
Java:
	public ArrayList<Clothing> sortClothesByName() {
		
		for(int i =0; i<clothes.size(); i++){
			
			// ???
			
		}
		return clothes;

	}

Das ist die Klasse Clothing:

Java:
public abstract class Clothing{
	
	String color, type;
	float price;
	
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
}

Danke, freu mich auf Tipps.
 
Es gibt in Java zwei einfache Möglichekeiten Listen zu sortieren, ohne selbst einen Algorithmus implementieren zu müssen. Deine erster Codeausschnitt ist also völlig überflüssig, das hat das JRE schon fertig.
a) Die zu Sortierenden Objekte implementiert Comparable. Dann kann man die Liste einfach an [JAPI]Collections.html#sort(java.util.List)[/JAPI] übergeben.
b) Man implementiert einen Compartor für die Klasse der zu Sortierenden Objekte und übergibt den zusammen der List an [JAPI]Collections.html#sort(java.util.List, java.util.Comparator)[/JAPI].

Welche von beiden Varianten man nimmt ist letzendlich eine Design-Entscheidung. Wenn es genau eine möglich Reihenfolge gibt empfiehlt sich a), wenn man nach verschiedenen Attributen sortieren können soll b). Der Code unterscheidet sich nur darin wie die Attribute referenziert werden, ob über this oder die zweite übergebene Referenz.

Für deinen Clothing würde sich für die Sortierung nach Type folgende Implementirung eines Comparators anbieten:
Java:
new Comparator<Clothing>(){
public int compare(Clothing a,Clothing b)
{
    return a.getType().compareTo(b.getType());
}
}

Das nutzt aus, das String selbst Comparable implementiert und die Konvention für die Rückgabewerte von compareTo und compare die selbe ist. Wenn du lieber Compareble nutzen willst, musst du nur die Signatur entsprechen ändern und a durch this ersetzen.
 
Vielen Dank für die schnelle Antwort.

Ich habe es mittlerweile auch nochmal versucht und ein Beispiel aus dem Internet an meines angepasst und der JUnit Test läuft auch reibungsfrei durch. 100% verstehe ich es aber nicht...

in der Klasse, die die Arraylist erstellt steht dieser teil:

Java:
public ArrayList<Clothing> sortClothesByName() {
			Collections.sort(clothes, new SortType());

			return clothes;
	}

und dann stand in dem Beispiel, man soll eine eigene Klasse erstellen "SortType" in der dann das hier steht:
Java:
import java.util.Comparator;

public class SortType implements Comparator<Clothing>{

	@Override
	public int compare(Clothing c, Clothing c1) {
		return c.getType().compareTo(c1.getType());
	}
	
	

}

ist diese Extraklasse notwendig?
 
Ja, diese Extraklasse ist notwendig, zumindest für Sortierattribute, die von denen in "compareTo()" abweichen.
Der Sinn eines oder mehrerer Comparatoren ist es ja, Collections (bzw. Listen) auf verschiedene Arten sortieren zu können. Mit Comparable lässt sich ja nur eine Art fest implementieren.
 
ok, ich glaube das habe ich soweit gecheckt, vielen Dank.

Wie ist das denn jetzt wenn ich eine HashMap habe? Dann sollte das ja eigentlich nicht funktionieren oder? Collections.sort(HashMap<>...) gibt es ja nicht...?!

Merci
 
Nein, eine HashMap kann man nicht sortieren. Aber eine TreeMap, die kann man genau genommen auch nicht sortieren, die ist immer sortiert. Da gibt es wieder die selben Möglichkeit wie bei der List, nur das man das beim erzeugen der TreeMap festlegen muss: Entweder man übergibt einen Comparator an den Konstruktor oder man implementiert Comparable. Wenn keines von beiden der Fall ist wirft die TreeMap eine Exception wenn man Elemente hinzufügen will.
 
Wie vom Vorposter erwähnt kannst du eine HashMap nicht sortieren. Du hast aber die Möglichkeit das EntrySet der HashMap zu sortieren.
 
ja, ich miene mal in einer Aufgabe gelesen zu haben dass man eine HashMap nach dem Value sortieren solll das ging irgendwie mit diesem "EntrySet" konnte aber nicht viel damit anfangen... ich glaube man musste ein wort in chars zerlegen in eine hashmap speichern und dann alphabetisch ausgeben oder so ähnlich...
 
Wo genau hast du denn da Probleme? An das EntrySet kommst du mit der Methode entrySet(). Als Rückgabe bekommst du ein Set, dass du per Collections.sort() sortieren kannst.
 
1. Wo steht, dass man HashMaps nach Values sortieren soll? (War warscheinlich Teil der Aufgabe...)
2. Sets lassen sich genauso wenig sortieren wie andere Collections ausser der List.
3. Man kann Maps nach Values sortieren und zwar indem man das ValueSet in eine List kopiert und mit 'nem entsprechenden Comparator (alternativ müssen die Values Comparable implementieren) an "Collections.sort()" übergibt. Selbiges funzt dann auch mit dem Entry- bzw. KeySet.
 

Zurück
Oben