[JAVA] hashmap ausgabe sortiert nach Key

shortround

Lieutenant
Registriert
Okt. 2006
Beiträge
740
hey leute,
ich muss für die uni einen wordcounter schreiben, der die wörter in einer datei zählt und sie dann sortiert nach dem key (das wort) ausgibt.

problem ist, dass wir keine treemap benutzen dürfen, sondern es mit einer hashmap lösen sollen.

die hashmap hat also als key einen String und als value integer.

jemand ne idee wie ich die ausgabe der hashmap jetzt nach key sortiert bekomme? die map selber kann im prinzip unsortiert bleiben, nur die ausgabe ist relevant.


p.s. treemap ist keine lösung! ;)
 
Zuletzt bearbeitet:
Wie genau landen denn die Wertepaare in der Map?
Wenn ich jetzt den Satz: "Ich bin ein Satz" nehme, dann ist der Aufbau:
Ich 1
bin 2
ein 3
Satz 4
?

Wie meinst du das mit Sortiert nach dem Key ausgeben?
Also nacheinander Wertepaar 1,dann 2, 3.......? dann würdest du ja den gleichen Satz quasi nocheinmal ausgeben oder willst du alphabetisch Sortieren?

MfG Psylo
 
ne bei "ich bin ein satz, satz"
würde es so aussehen:

ich 1
bin 1
ein 1
satz 2

also jedes wort wird gezählt.

und die ausgabe sollte dann sein:

bin 1
ein 1
ich 1
satz 2

also einfach die wörter alphabetisch sortiert.
 
Du kannst dir mit HashMap.keySet() ein Set mit den Keys ausgeben lassen. Dieses Set packst du in eine List (mit List.addAll()). Diese List kannst du jetzt mit Collections.sort() sortieren.
danach gehst du die sortierte Liste durch und kannst mit dem key das value aus der HashMap holen.
 
O.k. zu meinem Verständniss:
"Ich bin ein Satz, ein Satz der ich bin" wäre dann:
Ich 2
bin 2
der 1
ein 2
Satz 2
?

Dann könntest du mit Bubblesort (oder einem anderen Sortieralgorithmus) die Key auf/absteigend sortieren. Wenn du nicht auf ein ressourcenschonendes Programm setzen musst, dann würde ich als erstes alle "1"er Keys Suchen und diese dann in eine neue Map schreiben, danach wird der Zähler(Läufer) dann um eins erhöht und es werden alle "2"er Keys gesucht und in die neue Map geschrieben usw....

Ist halt nur doof, da du dann zur Laufzeit 2 gleichgroße Maps hast.

MfG Psylo

edit: du kannst natürlich auch innerhalb der Map die Werte tauschen. Wenn z.B. Bubblesort wie oben rausfindet, dass der Key von "bin" größer als der von "der" ist, dann werden diese beiden getauscht. So musst du keine 2. Map der gleichen größe erstellen sondern nur eine Wo du den Wert kurz zwischenspeicherst.

edit2: dann isses natürlich nicht alphabtisch sortiert.
Die Lösung von Cobinja ist allerdings einiges einfacher :)
 
Zuletzt bearbeitet:
habens jetzt gemacht wie cobinja gesagt hat:

Code:
sortedList.addAll(wordMap.keySet());
Collections.sort(sortedList);

for (int i = 0; i < sortedList.size(); i++) {
            System.out.println(sortedList.get(i) + ": " + wordMap.get(sortedList.get(i)));
        }

klappt super, dank dir cobinja
 
Ein kleiner Tip noch:
Geh durch sortedList mit 'nem Iterator durch. Vorraussetzung dafür ist, dass du die HashMap z.B. als HashMap<String, Integer> deklariert hast.
Code:
HashMap<String, Integer> wordMap = new HashMap<String, Integer>();
// Hier dein code zum Füllen der HashMap

// Hier wird die keys sortiert
List<String> sortedList = new ArrayList<String>();
sortedList.addAll(wordMap.keySet());
Collection.sort(sortedList);

// Und hier kommt der Iterator
Iterator<String> iter = sortedList.iter();
while (iter.hasNext()) {
  String key = iter.next();
  System.out.println(key + ": " + wordMap.get(key));
}
Damit vermeidest du, den key doppelt aus der sortedList holen zu müssen.
 
Zurück
Oben