Interface Comparable-Interface bei HashMap

pg1337

Bekanntes Mitglied
Sers liebe community,

ich habe mir mal selbst eine Aufgabe gestellt zum Thema, Listeninhalte vergleichen und nach einem bestimmten Kriterium sortieren, Stichwort: Comparable Interface.

Ich habe mir mal zwei Klassen erstellt, einmal Article & einmal die main Methode:

Java:
import java.util.*;

public class ArticleTest {
	
	public static void main(String[] args){
		
		Map<String, Integer> map1= new HashMap<String, Integer>();
		Article tv= new Article("Tv", 2000);
		Article radio= new Article("Radio", 150);
		Article dvdPlayer= new Article("Dvd-Player", 200);
		Article playStation= new Article("PS3", 700);
		Article computer= new Article("Computer", 1200);
		
		map1.put(tv.getName(), tv.getPreis());
		map1.put(radio.getName(), radio.getPreis());
		map1.put(dvdPlayer.getName(), dvdPlayer.getPreis());
		map1.put(playStation.getName(), playStation.getPreis());
		map1.put(computer.getName(), computer.getPreis());
		
	}
	
	public static int compareTo(Article article){
		return 0;
	}
}


Java:
public class Article {
	
	String name;
	int preis;
	
	
	public Article(String name, int preis) {
		super();
		this.name = name;
		this.preis = preis;
	}


	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getPreis() {
		return preis;
	}


	public void setPreis(int preis) {
		this.preis = preis;
	}
}


Ein Artikel hat jeweils ein Attribut "Name" und den dazugehörigen Preis.
Wie muss nun meine int compareTo() Methode aussehen?
(Ich habe bewusst ne HashMap gewählt, da ich jeden Artikel nur einmal haben möchte).


Sortiert soll nach dem Kriterium "Preis" werden, sprich das teuerste Element soll an erster Stelle stehen.
Wäre sehr dankbar, wenn mir da jemand weiterhelfen könnte.

Gruß,
pg1337
 
deine Article klasse muss das interface Comparable<Article> implementieren.... nicht die Testklasse

und als Map kannst du eine TreeMap nehmen, die sortiert dann deine Objekte gleich
 
Java:
public static int compareTo(Article article){
   return article.getPreis() - this.getPreis();

Zumindest, solange die Preise integer sind.
 
Erstens werden in der [japi]HashMap[/japi] die Elemente nicht sortiert. Du müsstest die [japi]SortedMap[/japi] o.ä. verwenden.
Zweitens sähe die Methode etwa so aus:
Java:
public static int compareTo(Article article) {
    if (getPreis() != article.getPreis()) {
        return getPreis() - article.getPreis();
    }
    return getName().compareTo(getName());
}
 
ach herrje woher euer static ?

er redet von Comparable Interface... das soll er implementieren in seiner Datenklasse
 
Wenn ich das die Article Klasse implementieren lasse, muss ich die Methoden mit übernehmen.

Ist jetzt die static Methode in der Main Klasse richtig, oder was kommt nun in die compareTo Methode in der Article Klasse?

Java:
public class Article implements Comparable<Article> {
	
// Attribute
// Konstruktor
// Methoden
// ...

	@Override
	public int compareTo(Article arg0) {
		// TODO Auto-generated method stub
		return 0;
	}
}
 
Ist jetzt die static Methode in der Main Klasse richtig,
Nein.
oder was kommt nun in die compareTo Methode in der Article Klasse?

Java:
public class Article implements Comparable<Article> {
	
// Attribute
// Konstruktor
// Methoden
// ...

	@Override
	public int compareTo(Article arg0) {
		// TODO Auto-generated method stub
		return 0;
	}
}
Das hier passt. In der Methode musst Du dann die Vergleich der für Dich relevanten Kriterien durchführen und zurückgeben musst Du dann einen negative Zahl, 0, oder eine positive Zahl, je nach dem wie die Sortierung durchgeführt werden soll.
Returns:
a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.
Details s. API Doku oder diverse im Netz auffindbare Codebeispiele.
 
verstehe ich nicht, wie das dann auszusehen hat.
Was muss ich in die if - Anweisungne reinschreiben?

Das mit -1, 0, 1 ist mir bekannt, nur wie setze ich das hier um?:/
 
Lass dir mal, wenn du Eclipse verwendest (oder eine andere Umgebung) den
Java:
.hashcode()
sowie die
Java:
.equals()
Methode ausgeben und schau, ob du damit was anfangen kannst.. Das sollte helfen.

x22
 
Es geht nicht um -1, 0 oder 1, sondern um negativ, null oder positiv. Wenn du zwei integer-Zahlenwerte miteinander vergleichen willst, kannst du die einfach voneinander abziehen und das Ergebnis zurückgeben. Wenn der Subtrahend größer ist als der Minuend, wird der Minuend vorher einsortiert. Umgekehrt kommt der Subtrahend in der Reihenfolge zuerst. Sind beide gleich groß, ändert sich die Reihenfolge nicht.

Wenn sich mit den Vergleichskriterien nicht so einfach rechnen lässt, musst du allerdings mit if oder switch vergleichen und dementsprechend eine Zahl zurückgeben...
 
Vielen Dank für die fixe Antwort.

Könntest du mir sagen, wie das nun bei meinem Beispiel auszusehen hat?
Ich muss das einmal gesehen haben, um es zu verstehen.
Wäre dir sehr dankbar. Habe grade ein paar Monate "frei" und versuche mir Java selbst beizubringen, nur sowas muss ich einmal gesehen haben.

Gruß,
pg1337
 
Allgemein:
Object Ordering (The Java™ Tutorials > Collections > Interfaces)
Hier noch ein spezielleres Beispiel für die if Abfrage und die Rückgabe. (den class cast kann man sich mittlerweile sparen:
Java Comparable Example | Java Tutorials and Examples

[EDIT]Vielleicht noch als allgemeinen Hinweis: Mit Comparable kann man die Standardreihenfolge von Objekten eines Typs festlegen. Soll nach verschiedenen Kriterien (mal nach Preis aufsteigend oder nach Name absteigen...) und unterschiedlicher Reihenfolge dynamisch sortiert werden, nimmt man einen Comparator.[/EDIT]
 
Zuletzt bearbeitet:
im grund einfach [c]return arg0.preis - preis[/c], da wie schon gesagt, es einfach um negativ, null oder positiv geht
 
Ok vielen Dank.
Wie rufe ich die Methode nun auf in der MainKlasse?

Ich muss ja dann jedes Objekt mit jedem Vergleichen.. gibts da nicht einen schnelleren Weg, dass man die Methode nur einmal aufrufen muss?

Wie würde das nun aussehen in der MainKlasse?

[EDIT]Weil iterieren kann ich mit ner for schleife schlecht über ne HashMap..[/EDIT]
Gruß
 
Zuletzt bearbeitet:
wenn du statt der HashMap zb die TreeMap nutzt, so kuemmert die sich schon um das, du musst gar nix mehr aufrufen
 
Nein, die sortiert nur nach Namen, will ja nach dem Preis sortieren.

Jetzt kommt als Ausgabe:

{Computer=1200, Dvd-Player=200, PS3=700, Radio=150, Tv=2000}


so will ich das ja nicht..
 
Dass du über eine Map nicht interieren kannst, hast du richtig verstanden.

Nur jetzt schau mal an, was du erzeugt hast. Du hast Objekte vom Typ Article erzeugt, warum also nicht eine Liste erstellen, in die du nun über <Article> (Generics) deine Article (Tv, Radio, etc..) nacheinander einfügst und nun über die Methode dann:

Java:
Collections.sort(list1)
dir die Werte sortieren lässt?

Sobald du nämlich diese Collections.sort Methode aufrufst wird das "comparable" berücksichtigt und danach sortiert..

Sprich so:
Java:
	List<Article> list1= new ArrayList<Article>();
		list1.add(tv);
		list1.add(radio);
		list1.add(dvdPlayer);
		list1.add(playStation);
		list1.add(computer);
		
		Collections.sort(list1);


Best regards,
x22
 
Die Sortierung legst Du in der compareTo Deiner Klasse fest. Wenn da eine Sortierung nach Name implementiert ist. Wird jede List, Map, Set... welche Objekte standardmäßig sortiert, eben diese in compareTo nutzen und somit nach Namen sortieren. Willst Du "dynamsich" und "variabl" sortieren, steck die Objekte in eine List, z.B. ArrayList und sortiere mittels Comparator. Hierfür müsst/kannst Du für jede gewünsche Sortierung Name aufsteigend, Name absteigend, Preis aufsteigend, Preis absteigend, Name aufsteigend/Preis absteigend... einen Komparator schreiben und mittels Collection.sort(list, comparator) sortieren.
 
Ok danke x22, das habe ich verstanden.
Bei System.out.println(list1) kommen aber komische Ergebnisse raus...:s
#Bin etwas verwirrt#..🙁/
 
Du musst nun auch erst über deine list1 iterieren..:

Java:
	for(Article article: list1){
			System.out.println("Name: " + article.name + " \t||Preis: " + article.preis);
		}
	}


Hoffe, das Problem ist gelöst.

Best regards,
x22
 
Jaa funktioniert 🙂)) Dankee!

Gut zu wissen, dass bei dem Collections.sort Alogorithmus sofort die comparable Methode berücksichtigt wird!

Gruß,
pg1337
 
Allgemein:
Object Ordering (The Java™ Tutorials > Collections > Interfaces)
Hier noch ein spezielleres Beispiel für die if Abfrage und die Rückgabe. (den class cast kann man sich mittlerweile sparen:
Java Comparable Example | Java Tutorials and Examples

[EDIT]Vielleicht noch als allgemeinen Hinweis: Mit Comparable kann man die Standardreihenfolge von Objekten eines Typs festlegen. Soll nach verschiedenen Kriterien (mal nach Preis aufsteigend oder nach Name absteigen...) und unterschiedlicher Reihenfolge dynamisch sortiert werden, nimmt man einen Comparator.[/EDIT]


Schau dir dennoch die Links von Michael... an, damit sollte es dir nochmals klarer werden.

x22
 

Zurück
Oben