# Nach Häufigkeit sortieren



## Leroy42 (26. Mrz 2007)

Problem: Erstellen eines nach Häufigkeit sortierten Arrays von z.B. Wörtern.

Ich möchte ein Array erstellen, daß z.B. Wörter nach ihrer Häufigkeit sortiert angibt:


```
class Wort extends Comparable {
  private String wort;
  private int anzahl;
  ...
}

Wort[] wörter;
```

Wie gehe ich da am besten vor?

Meine bisherige Lösung sieht so aus:


```
class Wort extends Comparable {
  private String wort;
  private int anzahl;
  ...
  public int compareTo(Object o) {
    return anzahl - ((Wort) o).anzahl;
  }
  public int hashCode() {return wort.hashCode();}
}

class MyInt {
  int theInt;
  ...
}

Map<String, Integer> words = new HashMap<String, MyIntr>();
```

Einlesen der Wörter und speichern in der Map mit MyInt(1) falls noch
nicht vorhanden. Falls bereits vorhanden, erhöhen der Anzahl. Hierbei 
muß ich dann hashCode und equals von Wort überschreiben lassen.

Dann umkopieren in ein entsprechendes Wort[] und anschließendes
Sortieren, wobei hier compareTo entsprechend überschrieben werden
muß.

Das ganze kommt mir jedoch sehr umständlich und unelegant vor   

Hat da jemand einen besseren Vorschlag? Gibt es hier eine Collection,
die angebrachter wäre?


----------



## SnooP (26. Mrz 2007)

Was spricht denn gegen ein Comparator-Objekt und sortieren lassen durch eine Collection deiner Wahl?


----------



## Leroy42 (26. Mrz 2007)

Das Problem ist ja, daß erst mal eine Collection erstellt werden muß,
die bei doppelten Wörtern die _Anzahl_ erhöht, was ist da für
eine Collection am sinnvollsten?

Ein Set geht nicht, weil ich beim Einlesen ja die Unterscheidung
über den String treffen muß, beim Sortieren jedoch über die Anzahl.  ???:L


----------



## Marco13 (26. Mrz 2007)

Da war doch mal was...
http://www.java-forum.org/de/viewtopic.php?t=45132&highlight=sortiert+nach

Wenns nicht hilft, sag bescheid.


----------



## Wildcard (26. Mrz 2007)

Warum das Array und nicht gleich eine TreeMap?

```
if(map.get(wort)!=null)
    map.put(wort, map.get(wort)++);
map.put(wort,1);
```


----------



## Leroy42 (26. Mrz 2007)

Wildcard hat gesagt.:
			
		

> Warum das Array und nicht gleich eine TreeMap?
> 
> ```
> if(map.get(wort)!=null)
> ...



Weil die TreeMap dann eben nach dem String und nicht nach der
Häufigkeit sortiert ist. Ich müßte die TreeMap dann ja auch wieder
in ein Array umkopieren und danach nach Häufigkeit sortieren.

Ob ich zum Einlesen nun eine TreeMap oder eine HashMap ist
dann schließlich egal; die Frage ist nur, was performanter ist.



			
				Marco13 hat gesagt.:
			
		

> Da war doch mal was...
> http://www.java-forum.org/de/viewtopic.php?t=45132&highlight=sortiert+nach
> 
> Wenns nicht hilft, sag bescheid.



Der Thread sagt mir, daß es keine andere Vorgehensweise gibt.


----------



## Wildcard (26. Mrz 2007)

Leroy42 hat gesagt.:
			
		

> Der Thread sagt mir, daß es keine andere Vorgehensweise gibt.


Stimmt ja, über die values geht's nicht  :?


----------

