# HashMap Key Reihenfolge umkehren



## lain (18. Feb 2009)

Hey,

Ich sitz seit heut mittag an dem Problem habs ewig oft gegooglet und sonstwas getan aber komm auf kein grünen Zweig.

Zum Problem...
Ich will eine gefüllte HashMap die in etwa so aussieht


```
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(5, "test1");
map.put(11, "vogel");
map.put(20, "hello");
//map wäre so aufgebaut
map= {5=test1, 11=vogel, 20=hello}

//von der Reihenfolge will ich sie aber so hinbiegen...
map = {20=hello, 11=vogel, 5=test1}
```

denn er sortiert blöderweise immer nach Keys ...
hat jemand ne Idee wie ich die Map so benutzen kann das die keys mit den höchsten einträgen (desc) als erstes eingetragen werden??


----------



## Murray (18. Feb 2009)

Das geht nicht; bei einer HashMap gibt es keine definierte Reihenfolge.





			
				javadoc hat gesagt.:
			
		

> This class makes no guarantees as to  the order of the map; in particular, it does not guarantee that the order  will remain constant over time.


----------



## lain (18. Feb 2009)

Murray hat gesagt.:


> Das geht nicht; bei einer HashMap gibt es keine definierte Reihenfolge.



Was für eine Collection kann ich dann dafür benutzen oder gibts ne alternative die sowas erlaubt? Ich würd ungern auf ne Map verzichten


----------



## andre111 (18. Feb 2009)

Der Ansatz ist zwar glaub ich bescheuert, aber ich würde in dem Fall entweder selber so ne Map schreiben, oder du liest halt jedes mal alle Einträge der Map aus kopierst die mithilfe eines selber implementierten Pair in eine Liste und sortierst diese dann nach dem gewünschten Kriterium.

Oder du speicherst die ganzen Daten gleich als Pairs in eine Liste.


----------



## Murray (18. Feb 2009)

lain hat gesagt.:


> Was für eine Collection kann ich dann dafür benutzen oder gibts ne alternative die sowas erlaubt? Ich würd ungern auf ne Map verzichten


java.util.TreeMap


----------



## lain (18. Feb 2009)

andre111 hat gesagt.:


> Der Ansatz ist zwar glaub ich bescheuert, aber ich würde in dem Fall entweder selber so ne Map schreiben, oder du liest halt jedes mal alle Einträge der Map aus kopierst die mithilfe eines selber implementierten Pair in eine Liste und sortierst diese dann nach dem gewünschten Kriterium.
> 
> Oder du speicherst die ganzen Daten gleich als Pairs in eine Liste.



Das mit den Pairs in ne Liste wär definitiv ne Möglichkeit ich werds wahrscheinlich so machen...

@ Murray
War auch erst meine Idee aber es ist total kotzig die map umgekehrt zu sortieren .. hast zu zufällig n einfaches snippet oder so als beispiel?


----------



## Gelöschtes Mitglied 5909 (18. Feb 2009)

nicht die schnellste Lösung was performance angeht aber ansonsten ganz nett:


```
package de.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Foo {

    public static void main( String[] args ) {
        Map<Integer, String> map = new HashMap<Integer, String>() {
            {
                put(1, "eins");
                put(2, "zwei");
                put(3, "drei");
            }
        };

        List<Integer> list = new ArrayList<Integer>(map.keySet());
        Collections.sort(list);
        Collections.reverse(list);

        for ( Integer integer : list ) {
            System.out.println("reverse sorted key -> " + integer);
        }

        for ( Integer integer : list ) {
            System.out.println("reverse map " + integer + " -> "
                    + map.get(integer));
        }

    }

}
```



> reverse sorted key -> 3
> reverse sorted key -> 2
> reverse sorted key -> 1
> reverse map 3 -> drei
> ...


----------



## 0x7F800000 (18. Feb 2009)

Der TreeMap kannst du doch einen eigenen Comparator übergeben, wo ist dann überhaupt das Problem?

```
TreeMap<Integer,String> map=new TreeMap(new Comparator<Integer>(){
    @Override
    public int compare(Integer a, Integer b){
       return b.compareTo(a);
    }
});

map.put(Integer.valueOf(1),"one");
map.put(Integer.valueOf(2),"two");
map.put(Integer.valueOf(3),"three");

//sollte in reihenfolge "three","two","one" gespeichert werden
```
ist ungetestet und nur schnell hingehackt.


----------



## lain (18. Feb 2009)

fett thanks to 4LL of u =D


----------

