treeMap.putall funktioniert nicht?!

  • Themenstarter Themenstarter Gelöschtes Mitglied 34244
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 34244

Gast
Hallo,

ich bin gerade dabei eine Funktion zu schreiben, die die Wörter aus einem String nach ihren Vorkommnissen zählt und auflistet.
Also, z.b. für den String "Dies ist ein Test. Dies ist ein weiterer Test"
Dies 2
ist 2
ein 2
weiterer 1
Test 2

Dazu benutze ich eine HashMap. Um das ganze zu sortieren importiere ich die HashMap in eine TreeMap. Dabei stelle ich allerdings fest, dass in der TreeMap Werte zum großteil nicht übernommen werden. Vorher hatte die HashMap eine Größe von ca. 7000 Objekten und danach die TreeMap nur noch 129. Was mache ich da falsch?
UPDATE: Offensichtlich liegt das am ValueComparator, wenn ich diesen entferne wird alles ordnungsgemäß importiert
Hier mein Code:

Java:
	String[] input = db.getBodies();
HashMap<String, Integer> mostWords = new HashMap<String, Integer>();
        ValueComparator bvc =  new ValueComparator(mostWords);
        TreeMap<String,Integer> sorted_map = new TreeMap<String,Integer>(bvc);
        long totalWords = 0;
		for(int i=0;i<input.length;i++){
			String[] words = input[i].split(" ");
			totalWords += words.length;
			
			for(String word:words){
				if(mostWords.containsKey(word)){
					mostWords.put(word, mostWords.get(word)+1);
				} else {
					mostWords.put(word, 1);
				}
			}
		}
        Log.d(mostWords.size()); // ca. 7000
        sorted_map.putAll(mostWords);
        Log.d(sorted_map.size()); // 129????
        //Log.d("results: "+sorted_map);

Hier noch die Klasse ValueComparator:
Java:
public class ValueComparator implements Comparator<String>{
    Map<String, Integer> base;
    public ValueComparator(Map<String, Integer> base) {
        this.base = base;
    }

    public int compare(String a, String b) {
        return base.get(b).compareTo(base.get(a));
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Eine TreeMap erlaubt keine doppelten Einträge. Wenn die Anzahl bei zwei Einträgen gleich ist gibt dein ValueComparator 0 zurück was beim Einfügen dazu führt das der schon vorhanden Wert mit dem neuen ersetzt wird.

Eine Map sollte immer nur nach den Keys strukturiert werden und nicht nach den Werten die diesen zugeordnet sind, das kann zu schwer vorhersehbaren verhalten führen.

Ich würde alle Einträge der Map als Array holen und das einfach sortieren.

Java:
Entry<String,Integer>[] words=mostWords.entrySet().toArray(new Entry<String,Integer>[mostWords.size()]);
Arrays.sort(words,new Comparator<Entry<String,Integer>>() {
    public int compare(Entry<String,Integer> a, Entry<String,Integer> b) {
        return a.getValue()-b.getValue();
    }
});
 
die compare-Methode wird hier als endgültige Entscheidung genommen, kein einfaches Objekt-compare danach noch,
wenn gleine Anzahl, dann als absolut gleich angenommen,

prüfe in deiner compare-Methode, ob Anzahl unterschiedlich, dann das als Ergebnis zurückgeben,
sonst noch die Strings normal vergleichen
 

Neue Themen


Zurück
Oben