Map nach value sortieren

jobu0101

Bekanntes Mitglied
Hallo!

Ich habe eine Map<Integer,Integer> und die würde ich gerne nach dem value sortieren lassen. Das heißt, ich will ein sortiertes KeySet haben, so dass der erste key auf den kleinsten value zeigt.

Wie lässt sich das in Java realisieren?

Danke schon einmal im Voraus!
 

Foermchen82

Top Contributor
Zum einen sind Maps erstmal unsortiert. Das liegt in deren Natur. Es gibt jedoch eine SonderLocke mit dem Namen SortedMap. Da sind jedoch die Daten nach dem Key sortiert.

Die Daten nach dem Value sortieren und in einer Map speichern schließt sich nach meinem Gefühl aus, da das gegensätzliche Nutzen sind.

Nimm doch ne Liste von Values. Oder was hast du vor??
 

jobu0101

Bekanntes Mitglied
Stell dir vor du hast zum Beispiel eine Tabelle von Benutzen. Jeder Benutzer hat eine ID und einen username. Das lässt sich in einer Map abspeichern. Über die ID kommst du an den username rann. Nun kann es doch möglich sein, dass man eine Liste ausgeben will, in der die Benutzer nach ihrem Namen sortiert auftauchen...
 

Foermchen82

Top Contributor
Ok, du musst deine DatenStruktur von deinem Verwendungszweck Trennen.
Du hast also UserObjekte mit name und id.
Die UserObjekte müssen am besten das Comparable Interface implementiern, damit du sie nach Name sortieren kannst ohne erst immer umständlich einen Comparator schreiben zu müssen.

Wenn du jetzt eine Map brauchst, nimmst du die ID aus dem Objekt als Key und das Objekt selbst als value.

Willst du aber ein Liste haben, dann nimm auch einfach eine Liste. Aus der holst du dann das UserObjekt und das beinhaltet auch die ID.
 

jobu0101

Bekanntes Mitglied
Das heißt ich muss eine eigene Klasse schreiben, die in einem Beispiel von eben je einen User mit ID und name zusammenfasst; in meinem Beispiel von ganz oben dann also eine Klasse, die zwei ints hat.

Und wie sieht das ganze mit sagen wir 10 Einträgen aus, bei denen ich nach jedem sortieren können will?
 

Foermchen82

Top Contributor
Dann hast du verloren *g*

Nein mal im ernst. was hast du denn vor? Wenn du Datenobjekte mit verschiedenen Values verschiedenartig sortieren willst, musst du das manuell machen. Oder du nimmst ne JTable an die du nen RowSorter hängst. Da kannst du durch den klick auf den Header nach jeder Spalte sortieren.
 

jobu0101

Bekanntes Mitglied
Dann hast du verloren *g*

Nein mal im ernst. was hast du denn vor? Wenn du Datenobjekte mit verschiedenen Values verschiedenartig sortieren willst, musst du das manuell machen. Oder du nimmst ne JTable an die du nen RowSorter hängst. Da kannst du durch den klick auf den Header nach jeder Spalte sortieren.

Ja Aber dafür brauch ich doch wohl keine JTable, die muss das Problem doch auch irgendwie intern lösen.
 

andiv

Bekanntes Mitglied
Zitat aus TableRowSorter (Java Platform SE 6)

TableRowSorter uses Comparators for doing comparisons. The following defines how a Comparator is chosen for a column:
If a Comparator has been specified for the column by the setComparator method, use it.
If the column class as returned by getColumnClass is String, use the Comparator returned by Collator.getInstance().
If the column class implements Comparable, use a Comparator that invokes the compareTo method.
If a TableStringConverter has been specified, use it to convert the values to Strings and then use the Comparator returned by Collator.getInstance().
Otherwise use the Comparator returned by Collator.getInstance() on the results from calling toString on the objects.
 
S

SlaterB

Gast
jaja, hatte mein Posting zwischenzeitlich gelöscht, um nicht unnötig zu stören, wen es noch interessiert, da stand:
Java:
    public static <T, U extends Comparable<U>>List<U> 
                       getSortedValueList(Map<T, U> map)
    {
        List<U> list = new ArrayList<U>(map.values());
        Collections.sort(list);
        return list;
    }

edit:
jetzt hat Foermchen82 auch den Kommentar dazu wieder entfernt, ein Hin und Her wenn man einmal mit Löschen anfängt ;)
 
Zuletzt bearbeitet von einem Moderator:

Janus

Bekanntes Mitglied
Aus dem Fundus:
Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

public class MapValueSorter<K, V extends Comparable<V>>
	implements Comparator<K> {
	private final Map<K, V> map;
	
	public MapValueSorter( final Map<K, V> map ) {
		this.map = map;
	}

	public int compare( final K o1, final K o2 ) {
		V v1 = map.get( o1 );
		V v2 = map.get( o2 );
		if( v1 == null && v2 == null ) {
			return 0;
		}
		if( v1 == null ) {
			return -1;
		}
		if( v2 == null ) {
			return 1;
		}
		return v1.compareTo( v2 );
	}
	
	public List<K> getSortedKeys() {
		List<K> keys = new ArrayList<K>( map.keySet() );
		Collections.sort( keys, this );
		return keys;
	}
	
	public List<V> getSortedValues() {
		List<V> values = new ArrayList<V>();
		for( K key : getSortedKeys() ) {
			values.add( map.get( key ) );
		}
		return values;
	}
}
 
I

ichWeißEsBesser

Gast
Leute ihr denkt alle zu kompliziert: Hier eine Möglichkeit egal was nach value zu sortieren:
Folgendes Beispiel: Wir haben eine Map und wollen nach den Values sortieren. Key ist ein Objekt Id (Falls ihr den Code kopiert und testen wollt, erstellt euch ein Objekt "Id" oder nehmt einfach einen String!), der Value ist ein Double.
BESONDERHEIT: wir achten darauf, dass mit gleichen Values umgegangen werden kann, diese also beim Sortieren nicht rausfliegen!

Vorgehensweise:
- Wir formen die Map<Id, Double> um in eine ArrayList<PREntry>
- ein PREntry enthält das was in der Map der Key (hier Id, kann auch String oder sonst was sein) und Value (hier weight) wäre,
Das Objekt PREntry sieht wie folgt aus:


Java:
public class PREntry implements Comparable<PREntry> {
	private Id id;
	private double weight;
	
	public PREntry(Id id, Double weight) {
		this.id = id;
		this.weight = weight;
	}
	
	public Id getId() {
		return id;
	}
	public double getWeight() {
		return weight;
	}
	
	public int compareTo(PREntry entry) {
		if (this.weight > entry.getWeight()) {
			return 1;
		} else if (this.weight == entry.getWeight()) {
			return 0; 
		}
		else return -1;
	}
}

So kann dann die Main aussehen, die genau das macht, was Thema dieses Threads ist:

Java:
public class Test2 {
	public static void main(String[] args) {
        
	       Map<Id, Double> unsortedMap = new HashMap<Id, Double>();	       
	       unsortedMap.put(new IdImpl("1"), 0.4);
	       unsortedMap.put(new IdImpl("2"), 0.1);
	       unsortedMap.put(new IdImpl("3"), 0.25);
	       unsortedMap.put(new IdImpl("4"), 0.25);
	       
	       List<PREntry> prList = new ArrayList<PREntry>();
	       for (Id id : unsortedMap.keySet()){
	    	   PREntry entry = new PREntry(id, unsortedMap.get(id));
	    	   prList.add(entry);
	       }
	       
	       System.out.println("unsortedList:");
	       for (PREntry entry : prList) {
	       		System.out.println("id / value: " + entry.getId() + " / " + entry.getWeight());
	       }
	       
	       Collections.sort(prList);
	       
	       System.out.println("sortedList:");
	       for (PREntry entry : prList) {
	       		System.out.println("id / value: " + entry.getId() + " / " + entry.getWeight());
	       }
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Verschachtelte Treemaps, nach Value sortieren Allgemeine Java-Themen 11
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
D WSDL-Aufruf funktioniert nicht mehr nach Umstieg auf Maven Allgemeine Java-Themen 4
Zrebna Tipps für Organisation von Code-Reviews nach einem Pull Request. Allgemeine Java-Themen 5
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
J4n5chmiddi Methoden Website-URL im Browser öffnen nach erfolgreicher Basisauthentifizierung in Java Allgemeine Java-Themen 12
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
W Pdf verwerfen, weil Checkbox nach Unterschrift geaendert wurde Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
S Swing Speichern nach Button-Klick Allgemeine Java-Themen 5
M Java 8 nach Java 6 konvertieren Allgemeine Java-Themen 7
N Neustarten des Codes nach der Fehlermeldung Allgemeine Java-Themen 17
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java Allgemeine Java-Themen 7
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
C Config nach bestimmten Wertdurchsuchen. Allgemeine Java-Themen 2
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
The Pi 2D-Grafik Tic Tac Toe nach Gewinn rot Allgemeine Java-Themen 1
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
T Textarea nach nur 1 wort durchsuchen Allgemeine Java-Themen 3
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
B Umgebungsvariable Anpassen der Umgebungsvariablen nach Java-Update ? Allgemeine Java-Themen 14
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
H Best Practice setHeader in jsp nach RequestDispatcher.include Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
M .jar nach Datei prüfen Allgemeine Java-Themen 2
F String nach Schlüsselwörtern durchsuchen und ganze Zeile ausgeben Allgemeine Java-Themen 4
HarleyDavidson Input/Output Heruntergeladene Datei direkt nach dem Download öffnen ohne zu speichern Allgemeine Java-Themen 1
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
VfL_Freak JDK installieren Problem mit Erstellungspfad nach Wechsel von Java7 auf Java8 Allgemeine Java-Themen 1
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
thet1983 nach teilen eines Dateinamens suchen Allgemeine Java-Themen 6
F JLabel nach 5 Sekunden wieder leeren Allgemeine Java-Themen 7
M Fasta nach Mustern durchsuchen dauert zu lange Allgemeine Java-Themen 2
J Bilder halb in falscher Farbe nach kopieren aus Web Allgemeine Java-Themen 3
Thallius Neuen Prozess starten, der auch nach Beedingung des Starter-Prozesses weiterläuft? Allgemeine Java-Themen 5
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
A Funktionen aufrufen nach Schema x Allgemeine Java-Themen 2
G JavaFX Problem nach Update auf Java 8 Allgemeine Java-Themen 0
AssELAss String jeweils nach x Zeichen Zeilenumbruch Allgemeine Java-Themen 1
F E-Mail aus JAVA senden nach Umstellung auf Netbean 7.4 mit Java 7U45 nicht mehr möglich Allgemeine Java-Themen 4
J Ausgabe nach Excel Allgemeine Java-Themen 1
K PCM_UNSIGNED nach PCM_SIGNED Allgemeine Java-Themen 0
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
AssELAss Zeilenumbruch immer nach bestimmtem Zeichen Allgemeine Java-Themen 1
L Strings nach sortiertem String zurück ordnen Allgemeine Java-Themen 0
A Java - Suche nach Datensatz mit DateChooser Allgemeine Java-Themen 0
L Strings nach gleichem Muster ordnen Allgemeine Java-Themen 4
F Nach Export wird PDF Datei nicht mehr gefunden Allgemeine Java-Themen 0
K Sortieren nach Vorgabe Allgemeine Java-Themen 6
G nervendes Problem mit unterschieden zwischen Javax64 und x86 | je nach Programmbedarf beides nötig Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben