如何在Java中对HashMap进行排序

本文概述

  • 按键对HashMap排序
  • 使用比较器接口按值对HashMap进行排序
Java HashMap默认情况下不保留任何顺序。如果需要对HashMap进行排序, 我们将根据需求对其进行显式排序。 Java提供了一个根据键和值对HashMap进行排序的选项。在本节中, 我们将学习如何根据键和值对HashMap进行排序。
  • 按键对HashMap排序
  • 按值对HashMap排序
按键对HashMap排序有以下几种按键对HashMap进行排序的方法:
  • 通过使用TreeMap
  • 通过使用LinkedHashMap
使用LinkedHashMap时, 应遵循以下过程:
当我们使用LinkedHashMap时, 我们需要获取Key set。将Set转换为List, 对列表进行排序, 然后以相同顺序将排序后的列表添加到LinkedHashMap中。我们在示例“按值对HashMap进行排序”中完成的相同过程。
按键对HashMap排序的示例
在下面的示例中, 我们使用TreeMap构造函数对元素进行排序, 并将HashMap类的对象作为参数传递。这是按键对HashMap排序的最简单方法。
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 HashMapHashMap< Integer, String> hm=new HashMap< Integer, String> (); //addding keys and values to HashMaphm.put(23, "Yash"); hm.put(17, "Arun"); hm.put(15, "Swarit"); hm.put(9, "Neelesh"); Iterator < Integer> 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("\n"); Map< Integer, String> map=new HashMap< Integer, String> (); System.out.println("After Sorting"); //using TreeMap constructor to sort the HashMapTreeMap< Integer, String> tm=newTreeMap< Integer, String> (hm); Iterator itr=tm.keySet().iterator(); while(itr.hasNext()){int key=(int)itr.next(); System.out.println("Roll no:"+key+"name:"+hm.get(key)); }}}

【如何在Java中对HashMap进行排序】输出:
Before SortingRoll no:17name:ArunRoll no:23name:YashRoll no:9name:NeeleshRoll no:15name:SwaritAfter SortingRoll no:9name:NeeleshRoll no:15name:SwaritRoll no:17name:ArunRoll no:23name:Yash

使用比较器接口按值对HashMap进行排序在Java中, 按值对HashMap进行排序很复杂, 因为没有可用的直接方法。要按值对HashMap进行排序, 我们需要创建一个Comparator。它根据值比较两个元素。
之后, 从Map中获取元素集并将Set转换为List。使用Collections.sort(List)方法通过传递自定义比较器, 按值对元素列表进行排序。现在创建一个新的LinkedHashMap并将已排序的元素复制到其中。由于LinkedHashMap保证了映射的插入顺序。我们得到一个HashMap, 其值按排序顺序。
按“键”和“值”对HashMap进行排序之间有一个细微的区别, 即它可以具有重复的值, 但不能具有重复的键。我们无法使用TreeMap对值进行排序, 因为TreeMap通过键对元素进行排序。
按值对HashMap排序的示例
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 HashMapHashMap< Integer, String> hm = new HashMap< Integer, String> (); 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< Integer, String> map = sortValues(hm); System.out.println("\n"); 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 valuesprivate static HashMap sortValues(HashMap map) { List list = new LinkedList(map.entrySet()); //Custom ComparatorCollections.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 orderHashMap 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; }}

输出:
Before Sorting:Roll no:1Name:RiteshRoll no:67Name:BobyRoll no:5Name:ZoyaRoll no:6Name:TusharRoll no:10Name:PraveenRoll no:12Name:AshuRoll no:78Name:YashAfter Sorting:Roll no:12Name:AshuRoll no:67Name:BobyRoll no:10Name:PraveenRoll no:1Name:RiteshRoll no:6Name:TusharRoll no:78Name:YashRoll no:5Name:Zoya

    推荐阅读