2015-06-15 8 views
5

Ho un HashMap come il seguenteCome ordinare HashMap in Java a seconda delle dimensioni della lista valori

HashMap<String, ArrayList<String>> map=new HashMap<String, ArrayList<String>>(); 

map.put("USA", Arrays.asList("CA","IA","IL")); 
map.put("India", Arrays.asList("MUM","CAL")); 
map.put("Canada", Arrays.asList("TOR")); 

voglio ordinare la mappa in base alle dimensioni della lista nel valore in ordine crescente. Come lo posso fare. C'è qualche buon metodo per farlo?

+8

Non è possibile ordinare una HashMap, perché HashMaps non supportano l'ordinazione. Dovrai metterli in una struttura dati che supporta l'ordinamento (ad esempio, Elenco, LinkedHashMap) se vuoi ordinarli. – Mshnik

+0

'Arrays.asList' accetta parametri di lunghezza variabile. non è necessario renderlo un array. – HuStmpHrrr

risposta

12
import static java.util.Comparator.comparingInt; 
import static java.util.stream.Collectors.toMap; 

Map<String, List<String>> sorted = map.entrySet().stream() 
     .sorted(comparingInt(e->e.getValue().size())) 
     .collect(toMap(
       Map.Entry::getKey, 
       Map.Entry::getValue, 
       (a,b) -> {throw new AssertionError();}, 
       LinkedHashMap::new 
     )); 

È possibile sostituire comparingInt(e->e.getValue().size()) con comparingByValue(comparingInt(List::size)) se si scopre che più leggibile

+1

+1 questa è la risposta. OP potrebbe voler fare riferimento alla [documentazione di LinkedHashMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html) per capire perché quella raccolta è la scelta migliore qui. –

+0

(utilizzando Java 8) – frhack

+0

Cosa fare in modo esatto: (a, b) -> {lanciare AssertionError();},? – frhack

0

Hai due problemi.

  1. La mappa non supporta l'ordinamento.

  2. SortedMap non supporta l'ordinamento sui valori solo l'ordinamento sulle chiavi.

Come risultato di questo utilizzo di una mappa o SortedMap non sta per aiutarti. Quello che devi fare è scorrere su di te la mappa e mettere ogni Entry<String, ArrayList<String>> in una raccolta come un elenco e quindi ordinare l'elenco con un confronto personalizzato. Vedere questo esempio TreeMap sort by value o questo esempio Sorting LinkedHashMap

Problemi correlati