Map (HashMap) sortiern nach den Value?

Status
Nicht offen für weitere Antworten.

Duster

Aktives Mitglied
Morgen mal einen kleine Frage:

Wie sortiert man eine Map, wo der Key ein beliebiger String ist und der Value eine Zahl, so das man
zum Schluß eine Map bekommt, wo der Key vom Typ String mit der größten zahl als Value an erster Stelle steht??
 

Duster

Aktives Mitglied
Habe jetzt eine Klasse für den Comparator geschrieben, nur weiß ich
leider nicht genau was ich in die Methode vom Comparator schreiben
soll! Habe mir schon ein paar Beispiele im Netz angeschaut, aber ich werde einfach nicht schlau daraus, weil ich auch gar nicht weiß, was ich eigentlich den Comparator übergebe!!
 

SamHotte

Top Contributor
Im Prinzip ist das das Gleiche, was du in eine compareTo(Object)-Methode schreibst, nur dass jetzt nicht das aktuelle Objekt mit dem übergebenen verglichen wird, sondern object1 mit object2.

Das heißt, du gibst -1 zurück, wenn o1 < o2 ist, du gibst 0 zurück, wenn beide gleich sind, und du gibst +1 zurück, wenn o1 > o2 ist.

Also grob gesagt:
- Typecast auf deinen Objekttyp (wenn der scheitert, wurde was falsches in die Map eingefügt)
- das interessante Feld (oder die interessanten Felder) 'rausholen und vergleichen
- -1, 0 oder 1 zurückgeben.

Diesen Comparator gibst du dann im Konstruktor deiner SortedMap, bspw. der TreeMap, voilà!
 

SamHotte

Top Contributor
Stimmt. Der Comparator sorgt nur dafür, dass nicht nach dem Key, sondern nach dieser Zahl sortiert wird. Ansonsten würde die natural order des Keys benutzt.
 

SamHotte

Top Contributor
Oder hab ich grad nen Denkfehler?

Edit: nö, richtig gedacht. Meine Anleitung war etwas allgemeiner gehalten, falls jemand beliebige Objekte da drin hat.
 

tomi89

Mitglied
Hey, habe fast das gleiche Problem wie der Threadersteller gehabt hat.
Ich kann mir eine Datenstruktur wählen und muss darin Buchstaben und ihre Häufigkeit, bspw. aus einem Text den ich einlese, speichern.
Habe mich für ne HashMap entschieden.
Nun muss ich die Buchstaben von a-z (werden vorher alle mittels toLowerCase() geschrumpft) sortiert nach der Häufigkeit ausgeben.
Ich will also auch nach Values sortieren und wollte das ca so umsetzten..

Java:
List<Character> sortedList = new ArrayList<Character>();
		
sortedList.addAll(letterMap.keySet());
Collections.sort(sortedList); [B]//hier muss der Comparator mitübergeben werden oder?[/B]
		
Iterator<Character> iter = sortedList.iterator();
while (iter.hasNext()) {
	Character key = iter.next();
    System.out.println(key + " : " + letterMap.get(key));
}

Allerdings werden meine Buchstaben ja nach ihrer Reihenfolge ausgegeben, weil ich keinen Comparator bei sort übergebe oder?
Hab das mit dem Comparator einfach nicht hinbekommen..

Gruß tomi
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Nein du willst nach Häufigkeiten sortieren, die du zum Zeitpunkt des Vergleiches noch garnicht hast. Du müsstest also erst einmal die Häufigkeiten zählen und dann sortieren-
 

tomi89

Mitglied
Buchstaben und Häufigkeiten befinden sich bereits gezählt in der letterMap
Habe den restlichen Code von mir einfach weggelassen und nur den Problemcode gepostet.
 

hdi

Top Contributor
Da Buchstaben intern nix anderes sind als Zahlen reicht ein normales int-Array:

Java:
// initialisieren
int[] powers = new int[26]; // a-z
for(int i = 0; i<powers.length; i++){
    powers[i] = 0;
}

// zählen
for(char c : readNextCharFromYourSource()){
    int cast = c-97; // 97 = 'a', 98 = 'b' usw. siehe ASCII-Tabelle
    powers[cast]++;
}

// ausgeben
for(int i = 0;i<powers.length;i++){ 
   char c = i+97;
   System.out.println(c+" : "+powers[i]+" mal");
}
 
Zuletzt bearbeitet:

tomi89

Mitglied
Also danke für die Hilfe erstmal.
@Marco13
Hab im Moment sehr viel zu tun nebenbei und konnte dein Code noch nicht ganz anschaun , aber danke für die ausführliche Hilfe. Werds mir die Tage noch genau anschauen.
@hdi Hatte mir die Array-Implementierung irgendwie schwerer vorgestellt^^ Müsste bei dir dann nur noch die Sortierung vornehmen.

Heute kam ich in der Pause kurz dazu meinen Code zu ändern und habs fast geschafft das gewünschte Ergebnis zu erzielen. Leider noch kleine Macken für die ich keine Lösung hatte.
Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;


public class TextCoder {
	
	/**
	 * Wandelt die Buchstaben des eingelesenen Strings (Texts) in Kleinbuchstaben um
	 * und liest die Buchstaben von a-z in eine Map ein.
	 * 97 (=a) und 122 (=z) oder zwischen 65 (=A) und 90 (=Z)
	 */
	public Map<Character, Integer> count(String text) {
		Map<Character, Integer> letterMap = new HashMap<Character, Integer>();
		text.toLowerCase();
		
		// Buchstaben von a-z in die Map einlesen
		for(int i=0;i < text.length();i++) {
			if( Character.isLetter(text.charAt(i)) ) {
				
				char aktChar = text.charAt(i);
				if(letterMap.containsKey(aktChar) == true) {
					int tmp = letterMap.get(aktChar);
					letterMap.put(aktChar, ++tmp);
				}
				else{
					letterMap.put(aktChar, 1);
				}
				
			}
		}
		
		return letterMap;
	}
	
	
	public Map<Character, Integer> sort(String text) {
		Map<Character, Integer> letterMap = count(text);
		Map<Character, Integer> newMap = new HashMap<Character, Integer>();
		
		int size = letterMap.size();
		char currKey = 'a';
		while(newMap.size() <= size) {
			for(int i=97;i<=122; i++) {
				
				
				if(letterMap.containsKey(currKey) == false) {
					currKey++;
				}
				else if(letterMap.containsKey((char)i) == false) {
					i++;
				}
				else if(letterMap.get((char)i) > letterMap.get((char)currKey)) {
					currKey = (char)i;
				}
			}
			newMap.put((char)currKey, letterMap.get((char)currKey) );
			System.out.println(currKey + " : " + newMap.get((char)currKey));
			letterMap.remove((char)currKey);
		}
		
		return newMap;
	}
	
	
	public static void main(String[] args) {
		TextCoder tc = new TextCoder();
		StringBuilder sb = new StringBuilder();
		
		try {
			BufferedReader br = new BufferedReader(new FileReader("cryptedText.txt"));
			String zeile = null;
			while ((zeile = br.readLine()) != null) {
				sb.append(zeile + "\n");
			}
			System.out.println("Text wurde erfolgreich eingelesen.\n");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		String text = sb.toString();
		tc.sort(text);
	}

}

Hier mal mein Code, Probleme macht die sort-Methode.
Da bekomm ich bei der Ausgabe nach meinen Buchstaben noch 2 Zeichen, weil mein "i" bzw. currKey noch erhöht wird obwohl ich schon alle Buchstaben sortiert habe und dann eben 2 mehr angezeigt werden.
Das ist aber eine Kleinigkeit denke ich.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
O HashMap Fragen Java Basics - Anfänger-Themen 8
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben