# HashMap sortieren



## Dit (25. Aug 2008)

Hallo, 
ich möchte gerne folgende Hashmap sortieren

```
HashMap<String, Integer> countedPlacesInFurn = mostFurnPlaces(vFurnPlaces);
```

die Hashmap soll jedoh nach dem Key Sortiert werden! Problem dabei ist "noch" 

es stehen folgende Keys in der Hashmap 

- Furnace1
- Furnace2
- Furnace3
- Furnace4
- Furnace5
- Furnace6
- Furnace7
- Furnace8
- Furnace9
- Furnace10

eine TreeMap sortiert ja von selbst wie ich gelesen habe, aber nach der Sortierfunktion kommt nach 1 erst 10 und dann 2,3,4 etc. .

habe inzwischen in den 5h arbeitstag alle möglichen dinge versucht, doch zu keinem Ergebnis gekommen. 

der beste Versuch war bisher folgender: 


```
Object[] entries = countedPlacesInFurn.entrySet().toArray();
  public int compare(Object A, Object B){
        Map.Entry le = (Map.Entry)A;
        Map.Entry re = (Map.Entry)B;

        if ((Comparable)le.getKey().toString().length() == (Comparable)re.getKey().toString().length()) {
          return ((Comparable)le.getKey()).compareTo((Comparable)re.getKey());
        } else if ((Integer)le.getKey().toString().length() < (Integer)re.getKey().toString().length()) {
          return -1;
        } else {
          return +1;
        }
      }
    });
```

hat  auch Prima geklappt, aber dann hab ich das "entries" Objekt, womit ich so recht nichts anfangen kann, da ich ja an meine Keys und Values dran kommen möchte, habe auch versucht zurück zu wandeln, aber nur ClassCastExceptions bekommen. 

wäre über jede noch so kleine Hilfe dankbar!


----------



## SlaterB (25. Aug 2008)

mit Entries kannst du was anfangen, zum Sortieren greifst du doch auch schon auf den Key zu:
> (Comparable)le.getKey()

wieso kannst du dann nicht später auch den Key auslesen?
genauso den Value,

--------

alternativ könntest du aus dem .keySet() eine Liste erstellen
und die normal sortieren

-------

was ist ansonsten die Frage?


----------



## Dit (25. Aug 2008)

```
for (int i = 1; i < (Integer)((Map.Entry)entries[i]).getValue(); i++) {
```

genau darauf bin ich nicht gekommen warum auch immer, vielle. auch aus Frust nicht gesehen 
wird zwar gerade auch nicht mehr richtig sortiert, aber ich kann in meiner LocalHistory dank Eclipse ja stände zurück springen! 

danke noch mal für den kleinen Arschtritt!!  :bae:

hier die funktionierende Lösung:



```
// First get the map's entries as array (or List):
    Object[] entries = countedPlacesInFurn.entrySet().toArray();

    // Sort the entries with your own comparator for the values:
    Arrays.sort(entries, new Comparator() {
      public int compare(Object lhs, Object rhs){
        Map.Entry le = (Map.Entry)lhs;
        Map.Entry re = (Map.Entry)rhs;

        if ((Comparable)le.getKey().toString().length() == (Comparable)re.getKey().toString().length()) {
          return ((Comparable)le.getKey()).compareTo((Comparable)re.getKey());
        } else if ((Integer)le.getKey().toString().length() < (Integer)re.getKey().toString().length()) {
          return -1;
        } else {
          return +1;
        }
      }
    });
```


----------

