# Reihenfolge einer SortedMap/TreeMap umkehren



## carknue (19. Sep 2010)

Hallo,

ich programmiere auf Android und habe ein Java Problem. 

Ich habe eine Liste mit den Results eines WLAN Scans. Diese Liste möchte ich gerne nach dem Empfangspegel sortieren. Das ganze mache über eine SortedMap und TreeMap. Mein Code funktioniert auch, nur möchte die Reihenfolge genau umgekehrt haben. Leider gibt es NavigableMap wohl nicht bei Android, sonst hätte ich es einfach mit map.descendingMap() machen können. 

Wie kann ich die Reihenfolge der Map, bzw. der sortierten wifiList am Ende umkehren?


```
wifiList = mainWifi.getScanResults();
SortedMap<Integer,ScanResult> map = new TreeMap<Integer,ScanResult>();
for(int r = 0 ; r < wifiList.size() ; r++){
     // get current ScanResult
     ScanResult ap = wifiList.get(r);
     // add to the map
     map.put(ap.level,ap);
     }
            	  
wifiList.clear();
              
for (Map.Entry<Integer,ScanResult> entry : map.entrySet()) {
     // load scanresult from map
     ScanResult ap = entry.getValue();
     wifiList.add(ap);          
     }
```

Gruß
Carsten


----------



## eRaaaa (19. Sep 2010)

Falls ich dich richtig verstanden habe und es um die SortedMap geht:

```
SortedMap<Integer,ScanResult> map = new TreeMap<Integer,ScanResult>(Collections.reverseOrder());
```


----------



## carknue (20. Sep 2010)

Ich merke gerade, dass der Code ein ganz anderes Problem hat. Und zwar werden Einträge unterschlagen, die den gleichen Pegel (ap.level) haben. Also, wenn in der wifiList 3 Netze mit einem Pegel von -50 enthalten sind, so befindet sich nach dieser Sortierung nur noch 1 Netz mit -50 in der sortiertenListe. Das geht natürlich nicht. Gibt es eine andere Möglichkeit diese wifiList zu sortieren?


----------



## eRaaaa (20. Sep 2010)

Ehrlich gesagt hatte ich mich das gestern schon gefragt, wieso du nicht einfach die Liste sortierst 
Du könntest einfach so etwas wie 
	
	
	
	





```
Collections.sort(wifiList);
```
 benutzen, dafür müsste ScanResult aber Comparable implementieren oder du übergibst auch dort einen Comparator!

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 12.4 Vergleichen von Objekten --> :rtfm:

Je nachdem welche Werte die "level-Werte" annehmen bei dir, könnte das einfach so etwas wie

```
Collections.sort(wifiList, new Comparator<ScanResult>() {
			@Override
			public int compare(ScanResult o1, ScanResult o2) {
				return o2.level - o1.level;
			}
		});
```
sein. (du solltest level besser private machen und getter definieren, aber das nur nebenbei)


----------

