如何按值对HashMap进行排序

在Java中, 由于没有可用的直接方法, 因此按值对HashMap进行排序很复杂。如果需要按值对HashMap进行排序, 则应创建一个Comparator。它根据值比较两个元素。
之后, 从Map中获取元素集并将Set转换为List。使用Collections.sort(List)方法通过传递自定义的比较器按值对元素列表进行排序。现在创建一个新的LinkedHashMap并将已排序的元素复制到其中。由于LinkedHashMap保证了映射的插入顺序。我们得到一个HashMap, 其值按排序顺序。
Java Collections.sort()方法Java collections类提供了一种对所有列表实现(例如LinkedList和ArrayList)进行排序的方法。有两个重载的sort方法():

  • sort(List list):按其自然顺序的升序对List的元素进行排序。
  • sort(List list, Comparator < T> ):根据比较器包含的顺序对列表的元素进行排序。
句法
public static < T extends Comparable < ? Super T> > void sort (List list)

该方法不返回任何值。它引发以下异常:
ClassCastException:如果列表包含不可相互比较的元素。
UnsupportedOperationException:如果指定列表的列表迭代器不支持set操作。
按键和值对HashMap排序的区别在于, 它可以具有重复的值, 但不能具有重复的键。我们无法使用TreeMap对值进行排序, 因为TreeMap按键对元素进行排序。
按值排序HashMap的示例
在下面的示例中, 我们按升序和降序对地图进行了排序。
import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class SortByValue {//implementation of HashMapMap< String, Integer> map = new HashMap< String, Integer> (); public static void main(String[] args) { SortByValue sv = new SortByValue(); sv.createMap(); System.out.println("Sorting values in ascending order:"); sv.sortByValue(true); System.out.println("Sorting values indescending order"); sv.sortByValue(false); }//method to add elements in the HashMapvoid createMap() {map.put("Apple", 65000); map.put("HP", 20000); map.put("Dell", 32000); map.put("Asus", 21478); map.put("Samsung", 36546); map.put("Lenovo", 19990); System.out.println("Before sorting: "); printMap(map); }//sort elements by valuesvoid sortByValue(boolean order) {//convert HashMap into List List< Entry< String, Integer> > list = new LinkedList< Entry< String, Integer> > (map.entrySet()); //sorting the list elementsCollections.sort(list, new Comparator< Entry< String, Integer> > () {public int compare(Entry< String, Integer> o1, Entry< String, Integer> o2) {if (order) {//compare two object and return an integerreturn o1.getValue().compareTo(o2.getValue()); } else {return o2.getValue().compareTo(o1.getValue()); }}}); //prints the sorted HashMapMap< String, Integer> sortedMap = new LinkedHashMap< String, Integer> (); for (Entry< String, Integer> entry : list) {sortedMap.put(entry.getKey(), entry.getValue()); }printMap(sortedMap); }//method for printing the elementspublic void printMap(Map< String, Integer> map) {System.out.println("Company\t Price "); for (Entry< String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() +"\t"+entry.getValue()); }System.out.println("\n"); }}

【如何按值对HashMap进行排序】输出:
Before sorting: CompanyPrice Dell32000HP20000Lenovo 19990Samsung 36546Apple65000Asus21478Sorting values in ascending order:CompanyPrice Lenovo 19990HP20000Asus21478Dell32000Samsung 36546MAC Book 65000Sorting values in descending order:CompanyPrice MAC Book 65000Samsung 36546Dell32000Asus21478HP20000Lenovo 19990

    推荐阅读