# HashMap (String, Object(String , int)) nach int sortieren



## tank (26. Okt 2007)

Hi,

gibt es eine Möglichkeit die im Titel genannte HashMap nach einem Attribut des value-Object zu sortieren!?
In diesem Fall eben eine Zahl!?

mfg

tank


----------



## maki (26. Okt 2007)

Seit wann kann man denn Maps sortieren? 

Nachtrag: Du könntest dir natürlich die values geben lassen und diese dann in eine Liste klopfen. Diese Liste kanst du dann von deiner eigenen Comparator Implementierung sortieren lasse wie du möchtest.


----------



## Guest (26. Okt 2007)

Hi,

ja daran hab ich auch schon mal kurz gedacht ;-)
Aber die keys sollen natürlich weiterhin den values zugeordnet bleiben


----------



## maki (26. Okt 2007)

Bleiben sie doch 

Alle listen haben übrigens einen Konstruktor, der eine Collection entgegenimmt.

Ein Comparator ist nicht schwer zu schreiben, besonders in deinem Fall.

Hast du konkrete Fragen?


----------



## Guest (26. Okt 2007)

joa hab das eben mal versucht aber noch Probeleme mit dem Comparator...


```
public static void main(String[] args) {
    HashMap hashmap = new HashMap();
    hashmap.put("mp3", new AnyFileType("mp3", 4));
    hashmap.put("mp4", new AnyFileType("mp4", 7));
    hashmap.put("doc", new AnyFileType("doc", 10));
    hashmap.put("xls", new AnyFileType("xls", 8));
    ArrayList list = new ArrayList(hashmap.values());
    Collections.sort(list, new Comparator() {
      public int compare(Object o1, Object o2) {
        int wert1 = ( (AnyFileType) o1).getNumberOf();
        int wert2 = ( (AnyFileType) o2).getNumberOf();
        return wert2.compareTo(wert1);
      }
    });
  }
```


beim Return bin ich mir grad net sicher....


----------



## maki (26. Okt 2007)

```
public static void main(String[] args) {

		    Map<String, AnyFileType> map = new HashMap<String, AnyFileType>();
		    map.put("mp3", new AnyFileType("mp3", 4));
		    map.put("mp4", new AnyFileType("mp4", 7));
		    map.put("doc", new AnyFileType("doc", 10));
		    map.put("xls", new AnyFileType("xls", 8));
		    
		    List<AnyFileType> list = new ArrayList<AnyFileType>(map.values());

		    Collections.sort(list, new Comparator<AnyFileType>() {
		      public int compare(AnyFileType o1, AnyFileType o2) {
		        int wert1 = o1.getNumberOf();
		        int wert2 = o2.getNumberOf();
		        
		        return wert1 - wert2;
		      }
		    });
		  }
```
Solltest keine Container für "raw" Typen erstellen sondern immer den Typen angeben (zB. HashMap<String, AnyFileType>), so bist du einerseits Typsicher und andererseits brauchst du nicht mehr zu casten 

Auch solltest du keine Konkreten Typen Verwenden wenn nicht notwendig, so bleibst du von der Implementierung unabhängig (zB. Map anstatt HashMap, List anstatt ArrayList).

Falls du deinen Comparator öfters benutzen willst, stifte ihm doch eine eigene (öffentliche statische innere) Klasse.


----------



## byte (26. Okt 2007)

maki hat gesagt.:
			
		

> Seit wann kann man denn Maps sortieren?


Seit jeher. Aber man sollte dann schon eine SortedMap verwenden, wie z.B. TreeMap. HashMap ist da gänzlich ungeeignet.



			
				HashMap 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.


----------



## maki (26. Okt 2007)

Stimmt auch wieder byto, der TreeMap kann man dann seinen eigenen Comparator übergeben.

Hab mir die TreeMaps abgewöhnt da Hibernate seine eigenen Implementierung verwendet.


----------

