2015-12-20 16 views
6

come ordinare un hashmap per il valore intero e una delle risposte che ho trovato è heresorta una HashMap dal valore intero disc

che scritto da Evgeniy Dorofeev e la sua risposta era come questo

HashMap<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("a", 4); 
    map.put("c", 6); 
    map.put("b", 2); 
    Object[] a = map.entrySet().toArray(); 
    Arrays.sort(a, new Comparator() { 
     public int compare(Object o1, Object o2) { 
      return ((Map.Entry<String, Integer>) o2).getValue().compareTo(
        ((Map.Entry<String, Integer>) o1).getValue()); 
     } 
    }); 
    for (Object e : a) { 
     System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : " 
       + ((Map.Entry<String, Integer>) e).getValue()); 
    } 

uscita

c : 6 
a : 4 
b : 2 

la mia domanda è come il genere diventa Desc ?? e se voglio ordinare lo HashMapAsc Come posso farlo ??

e l'ultima domanda è: come posso avere il primo elemento dopo l'ordinamento?

+2

probabilmente si può invertire l'ordine commutando 'o2' con' o1' nel metodo 'compare' - diventando il primo elemento è solo 'a [0]' e quindi utilizzare la stessa logica del ciclo for per ottenere il valore e la chiave !? – luk2302

+0

thanx @ luk2302 :) –

+1

Possibile duplicato di [Come ordinare una mappa sui valori in Java?] (Http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on -the-values-in-java) –

risposta

6

Per interruttore di ordine inverso o2 e o1. Per ottenere il primo elemento appena accedere alla matrice di indice 0:

Map<String, Integer> map = new HashMap<>(); 
map.put("a", 4); 
map.put("c", 6); 
map.put("b", 2); 
Object[] a = map.entrySet().toArray(); 
Arrays.sort(a, new Comparator() { 
    public int compare(Object o1, Object o2) { 
     return ((Map.Entry<String, Integer>) o1).getValue().compareTo(
       ((Map.Entry<String, Integer>) o2).getValue()); 
    } 
}); 
for (Object e : a) { 
    System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : " 
        + ((Map.Entry<String, Integer>) e).getValue()); 
}   

System.out.println("first element is " + ((Map.Entry<String, Integer>) a[0]).getKey() + " : " 
     + ((Map.Entry<String, Integer>) a[0]).getValue());   

che stampa

b: 2
un: 4
c: 6
primo elemento è b: 2

Se si ha accesso all'espressione lambda, è possibile semplificare l'ordinamento utilizzando:

Arrays.sort(a, (o1, o2) -> 
    ((Map.Entry<String, Integer>) o1).getValue().compareTo(((Map.Entry<String, Integer>) o2).getValue())); 
2

Prima di tutto, rispondendo alla tua domanda: basta invertire il risultato del metodo compare per cambiare ASC in DESC.

HashMap<String, Integer> map = new HashMap<String, Integer>(); 
map.put("a", 4); 
map.put("c", 6); 
map.put("b", 2); 
Object[] a = map.entrySet().toArray(); 
Arrays.sort(a, new Comparator() { 
    public int compare(Object o1, Object o2) { 
     // just reverse the result of the comparison 
     return -((Map.Entry<String, Integer>) o2).getValue().compareTo(
       ((Map.Entry<String, Integer>) o1).getValue()); 
    } 
}); 
for (Object e : a) { 
    System.out.println(((Map.Entry<String, Integer>) e).getKey() + " : " 
      + ((Map.Entry<String, Integer>) e).getValue()); 
} 

Ma se avete bisogno di lavorare con un ordinato Map, vi suggerisco di utilizzare un'istanza di TreeMap che gestisce l'ordinamento di per sé.

+0

grazie molto @Orlangure –

3

In Java 8, si potrebbe fare qualcosa di simile:

System.out.println(map.entrySet().stream().sorted((o1, o2) -> { 
     return o2.getValue().compareTo(o1.getValue()); 
    }).findFirst());//would return entry boxed into optional which you can unbox. 
+0

grazie per la risposta :) –

+0

Nessun problema .. La sua concisa e facile da leggere. Non devi fare più conversioni da un oggetto all'altro e viceversa. – SMA

+0

sì, semplifica molto il codice –