Sortieren von HashMap, die von Werten unter Verwendung einer TreeMap und Komparator
Im mit dem folgenden code erstellt eine hashmap und dann Sortieren Sie die Werte in der hashmap durch die Verwendung einer treemap und ein Komparator. Die Ausgabe wird jedoch etwas unerwartet.
Also irgendwelche Gedanken, was Im tun falsch wäre hilfreich
Code
public static void main(String[] args) {
System.out.println("Most freq"+mostFreq(" i me hello hello hello me"));
}
public static String[] mostFreq(String str){
if ((str==null)||( str.trim().equalsIgnoreCase("")))
return null;
String[] arr = new String[10];
String[] words= str.split(" ");
Map <String,Integer> map = new HashMap<String,Integer>();
for (String word :words)
{
int count =0;
if (map.containsKey(word))
{
count= map.get(word);
map.put(word, count+1);
}
else
map.put(word, 1);
}
MyComparator comp= new MyComparator(map);
Map<String,Integer> newMap= new TreeMap(comp);
newMap.putAll(map);
Iterator it= newMap.entrySet().iterator();
while (it.hasNext())
{
Map.Entry pairs = (Map.Entry) it.next();
System.out.println("Key "+pairs.getKey()+"-- value"+pairs.getValue());
}
return arr;
}
Hier ist der Komparator
package samplecodes;
import java.util.Comparator;
import java.util.Map;
public class MyComparator implements Comparator {
Map map;
public MyComparator(Map map){
this.map=map;
}
@Override
public int compare(Object o1, Object o2) {
return ((Integer)map.get(o1) >(Integer)map.get(o2)? (Integer)map.get(o1):(Integer)map.get(o2));
}
}
Und der Ausgang ist von der form
me-2
hello-3
i-3
- Dein code produziert nicht diese Ausgabe. Sind Sie sicher, es ist die, die Sie verwenden?
- Auch vielleicht nehmen Sie einen Blick an how-to-sort-a-mapkey-value-on-the-values-in-java
- viele schlechte Geruch in deinem code: bitte richtige add-Generika-Typ param für Ihre Map, Iterator, usw.. In
mostFreq()
sind Sie wiederarr
ist, die ist einfach ein leeres String-array, das nie berührt wurde in der Methode. Ich bin auch die Antworten in eine Antwort über Ihre Logik problem - Das war eine Methode im Aufbau . Ich testete einige der Datenstrukturen, bevor ich beendete die Codierung der problem-und das ist, wenn ich die Frage gepostet. Guten Fang, obwohl!
- Wie ich schon in meinem anderen Kommentar, Sie sind über Extras /Daten-Struktur, in der falsche Weg. Die Art und Weise Sie TreeMap ist einfach nicht, wie es sich wohl zu verwenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte überprüfen Sie die JavaDoc von
vergleichen
: Sie kehren nicht wieder, die größeren Wert, aber-1
füro1
<o2
,0
füro1
=o2
und1
füro1
>o2
. So könnte man schreiben:if(o1==o2) return 0; return (Integer)map.get(o1) >(Integer)map.get(o2)? 1:-1;
ist eine bessere option, wenn Sie brauchen, Häufigkeit aller Wörter. mitcompareTo
scheint zu unterdrücken Wörter der gleichen Frequenz.compare()
sollte "symmetrisch" docs.oracle.com/javase/6/docs/api/java/util/... : sgn(compare(a,b)) sollte die Rückkehr -sgn(compare(b,a)). Jedoch Ihre Logik nicht: wenn Wert in anzeigen für die wichtigsteno1
undo2
ist die gleiche, beide zu vergleichen(a,b) und compare(b,a) zurück 1, die gegen den Vertrag.Den Java-Doc von
TreeMap
klar, dass:sollten wir nicht gegen diese Regel verstoßen, indem Sie mit
TreeMap
Sortieren von Werten.Allerdings zu Sortieren, indem Sie die Werte, die wir tun können, die folgenden:
LinkedList
Einträge dermap
Collection.sort
zum Sortieren der EinträgeLinkedHashMap
: hält die Schlüssel in der Reihenfolge, wie Sie eingefügt werden, die derzeit sortiert auf Natürliche Bestellung.Rückkehr der
LinkedHashMap
wie die sortiertmap
.Referenz: Sortieren Anzeigen nach Wert
Was Sie tun, ist wirklich ein Missbrauch von Werkzeugen.
Ich glaube, dass das, was Sie tun müssen, ist:
Natürlich können Sie noch Gebrauch machen von so etwas wie einem TreeSet und einsatzhäufigkeit als Schlüssel, aber Sie sollten die Liste der Worte, als der Wert dieser Karte (aka Multi-Map), statt zu schreiben eine problematische Komparator, die sich nicht an den Vertrag von Komparator: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare%28T,%20T%29 Sowohl Ihre originelle Umsetzung und der Kommentar von einem der die Antworten nicht im Einklang mit der Regel der
sgn(compare(x, y)) == -sgn(compare(y, x)) for all x and y
(Das original ist noch schlimmer).einige code-snippet, für das geben Sie Hinweise:
Den fehlenden Teil sollte eigentlich nichts schwierig.