logo

Com ordenar HashMap a Java

Java HashMap no conserva cap ordre per defecte. Si cal ordenar HashMap, l'ordenarem explícitament en funció dels requisits. Java ofereix una opció per ordenar HashMap en funció de claus i valors. En aquesta secció, aprendrem a ordenar HashMap segons claus i valors.

  • Ordena HashMap per claus
  • Ordena HashMap per valors

Ordena HashMap per claus

Hi ha maneres següents d'ordenar HashMap per claus:

  • Mitjançant l'ús de TreeMap
  • Mitjançant l'ús de LinkedHashMap

Quan utilitzem LinkedHashMap, hauríem de seguir el procés:

Quan utilitzem LinkedHashMap, hem d'establir la clau. Converteix el conjunt en llista, ordena la llista i, a continuació, afegeix la llista ordenada a LinkedHashMap en el mateix ordre. El mateix procés que hem fet a l'exemple Ordena HashMap per valor .

Exemple d'ordenació de HashMap per claus

A l'exemple següent, utilitzem el constructor TreeMap per ordenar els elements i passar l'objecte de la classe HashMap com a argument. Aquesta és la manera més senzilla d'ordenar HashMap per claus.

 import java.util.Map; import java.util.HashMap; import java.util.TreeMap; import java.util.Iterator; public class SortHashMapByKeys { public static void main(String args[]) { //implementation of HashMap HashMap hm=new HashMap(); //addding keys and values to HashMap hm.put(23, 'Yash'); hm.put(17, 'Arun'); hm.put(15, 'Swarit'); hm.put(9, 'Neelesh'); Iterator it = hm.keySet().iterator(); System.out.println('Before Sorting'); while(it.hasNext()) { int key=(int)it.next(); System.out.println('Roll no: '+key+' name: '+hm.get(key)); } System.out.println('
'); Map map=new HashMap(); System.out.println('After Sorting'); //using TreeMap constructor to sort the HashMap TreeMap tm=new TreeMap (hm); Iterator itr=tm.keySet().iterator(); while(itr.hasNext()) { int key=(int)itr.next(); System.out.println('Roll no: '+key+' name: '+hm.get(key)); } } } 

Sortida:

 Before Sorting Roll no: 17 name: Arun Roll no: 23 name: Yash Roll no: 9 name: Neelesh Roll no: 15 name: Swarit After Sorting Roll no: 9 name: Neelesh Roll no: 15 name: Swarit Roll no: 17 name: Arun Roll no: 23 name: Yash 

Ordena HashMap per valors mitjançant la interfície de comparació

A Java, ordenar HashMap per valors és complicat perquè no hi ha cap mètode directe disponible. Per ordenar el HashMap per valors, hem de crear un Comparador . Compara dos elements en funció dels valors.

Després d'això, obteniu el conjunt d'elements del mapa i convertiu el conjunt a la llista. Utilitzar el Collections.sort(Llista) mètode per ordenar la llista d'elements per valors passant un comparador personalitzat. Ara crea una nova LinkedHashMap i copieu-hi els elements ordenats. Des que LinkedHashMap garanteix l'ordre d'inserció dels mapes. Obtenim un HashMap els valors del qual estan ordenats.

vaja

Hi ha una lleugera diferència entre ordenar HashMap per claus i valors és que pot tenir valors duplicats però no claus duplicades. No podem utilitzar TreeMap per ordenar valors perquè TreeMap ordena els elements per claus.

Exemple d'ordenació de HashMap per valors

 import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; public class SortHashMapValue { public static void main(String[] args) { //implementing HashMap HashMap hm = new HashMap(); hm.put(6, 'Tushar'); hm.put(12, 'Ashu'); hm.put(5, 'Zoya'); hm.put(78, 'Yash'); hm.put(10, 'Praveen'); hm.put(67, 'Boby'); hm.put(1, 'Ritesh'); System.out.println('Before Sorting:'); Set set = hm.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry map = (Map.Entry)iterator.next(); System.out.println('Roll no: '+map.getKey()+' Name: '+map.getValue()); } Map map = sortValues(hm); System.out.println('
'); System.out.println('After Sorting:'); Set set2 = map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry me2 = (Map.Entry)iterator2.next(); System.out.println('Roll no: '+me2.getKey()+' Name: '+me2.getValue()); } } //method to sort values private static HashMap sortValues(HashMap map) { List list = new LinkedList(map.entrySet()); //Custom Comparator Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return ((Comparable) ((Map.Entry) (o1)).getValue()).compareTo(((Map.Entry) (o2)).getValue()); } }); //copying the sorted list in HashMap to preserve the iteration order HashMap sortedHashMap = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedHashMap.put(entry.getKey(), entry.getValue()); } return sortedHashMap; } } 

Sortida:

 Before Sorting: Roll no: 1 Name: Ritesh Roll no: 67 Name: Boby Roll no: 5 Name: Zoya Roll no: 6 Name: Tushar Roll no: 10 Name: Praveen Roll no: 12 Name: Ashu Roll no: 78 Name: Yash After Sorting: Roll no: 12 Name: Ashu Roll no: 67 Name: Boby Roll no: 10 Name: Praveen Roll no: 1 Name: Ritesh Roll no: 6 Name: Tushar Roll no: 78 Name: Yash Roll no: 5 Name: Zoya