如何在 Java 中按值对 HashMap 排序?

HashMap 在 java 中提供快速搜索. 它们将项目存储在 **key**, **value**对中. 为了从 HashMap 中获得一个 value,我们使用相应的 key

HashMaps是实现字典和目录的好方法。

关键和值可以是不同的类型(例如 - 字符串,整数)。

我们可以根据密钥和值对HashMap中的条目进行排序。

在本教程中,我们将根据值来排序HashMap。

基本策略是将HashMap中的值列入列表并对列表进行排序.在这里,如果值的数据类型是字符串,那么我们使用比较器来排序列表。 有关比较器的更多信息,请阅读本教程(/community/tutorials/comparable-and-comparator-in-java-example)。

一旦我们对值列表进行排序,我们将基于这个新列表重新构建HashMap。

让我们来看看代码。

按值简单示例排序HashMap

我们首先在列表中获取 String 值,然后将列表排序。

要对列表中的字符串值进行排序,我们使用比较器。

1Collections.sort(list, new Comparator<String>() {
2            public int compare(String str, String str1) {
3                return (str).compareTo(str1);
4            }
5        });

一旦我们对列表进行了排序,我们将基于此排序列表构建HashMap。

完整的代码如下:

 1package com.journaldev.collections;
 2
 3import java.util.ArrayList;
 4import java.util.Collections;
 5import java.util.Comparator;
 6import java.util.HashMap;
 7import java.util.LinkedHashMap;
 8import java.util.Map;
 9import java.util.Map.Entry;
10
11public class Main {
12    public static void main(String[] args) {
13        HashMap<String, String> map = new HashMap<>();
14        LinkedHashMap<String, String> sortedMap = new LinkedHashMap<>();
15        ArrayList<String> list = new ArrayList<>();
16        map.put("2", "B");
17        map.put("8", "A");
18        map.put("4", "D");
19        map.put("7", "F");
20        map.put("6", "W");
21        map.put("19", "J");
22        map.put("1", "Z");
23        for (Map.Entry<String, String> entry : map.entrySet()) {
24            list.add(entry.getValue());
25        }
26        Collections.sort(list, new Comparator<String>() {
27            public int compare(String str, String str1) {
28                return (str).compareTo(str1);
29            }
30        });
31        for (String str : list) {
32            for (Entry<String, String> entry : map.entrySet()) {
33                if (entry.getValue().equals(str)) {
34                    sortedMap.put(entry.getKey(), str);
35                }
36            }
37        }
38        System.out.println(sortedMap);
39    }
40}

输出:

1{8=A, 5=B, 3=D, 7=F, 10=J, 2=W, 1=Z}

Values Are Of Type String

HashMap 条目按 String 值进行排序。

HashMap 按值排序的另一个例子

如果 HashMap 中的值类型为整数,则代码将如下:

 1package com.JournalDev;
 2
 3import java.util.ArrayList;
 4import java.util.Collections;
 5import java.util.Comparator;
 6import java.util.HashMap;
 7import java.util.LinkedHashMap;
 8import java.util.Map;
 9import java.util.Map.Entry;
10
11public class Main {
12    public static void main(String[] args) {
13        HashMap<String, Integer> map = new HashMap<>();
14        LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
15        ArrayList<Integer> list = new ArrayList<>();
16        map.put("A", 5);
17        map.put("B", 7);
18        map.put("C", 3);
19        map.put("D", 1);
20        map.put("E", 2);
21        map.put("F", 8);
22        map.put("G", 4);
23        for (Map.Entry<String, Integer> entry : map.entrySet()) {
24            list.add(entry.getValue());
25        }
26        Collections.sort(list); 
27        for (int num : list) {
28            for (Entry<String, Integer> entry : map.entrySet()) {
29                if (entry.getValue().equals(num)) {
30                    sortedMap.put(entry.getKey(), num);
31                }
32            }
33        }
34        System.out.println(sortedMap);
35    }
36}

输出:

1{D=1, E=2, C=3, G=4, A=5, B=7, F=8}

Values Are Of Type Integer

在这里,HashMap 值按整数值进行排序。

使用自定义比较器对HashMap进行排序

如果您注意到上述示例,Value 对象将执行 Comparator接口。

我们还可以创建一个自定义比较器以根据值来排序哈希地图,当您的值是自定义对象时,这是有用的。

让我们举一个例子,其中值是名为Name的类,这个类有两个参数, firstName 和 lastName。

班级名称的代码是:

 1package com.JournalDev;
 2
 3public class Name {
 4   String firstName;
 5   String lastName;
 6   Name(String a, String b){
 7       firstName=a;
 8       lastName=b;
 9
10   }
11    public String getFirstName() {
12        return firstName;
13    }
14
15}

定制比较器将看起来像:

1Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());

我们根据 firstName 排序名称,我们也可以使用 lastName 来排序,而不是使用列表从地图中获取值,我们将使用 LinkedHashMap 直接创建排序的哈希地图。

完整的代码是:

 1public static void main(String[] args) {
 2        HashMap<Integer, Name> hmap = new HashMap<Integer, Name>();
 3        Name name1 = new Name("Jayant", "Verma");
 4        Name name2 = new Name("Ajay", "Gupta");
 5        Name name3 = new Name("Mohan", "Sharma");
 6        Name name4 = new Name("Rahul", "Dev");
 7
 8        hmap.put(9, name1);
 9        hmap.put(1, name2);
10        hmap.put(6, name3);
11        hmap.put(55, name4);
12
13        Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());
14
15        LinkedHashMap<Integer, Name> sortedMap = hmap.entrySet().stream()
16                .sorted(Map.Entry.<Integer, Name>comparingByValue(byName))
17                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
18
19//printing the sorted hashmap 
20        Set set = sortedMap.entrySet();
21        Iterator iterator = set.iterator();
22        while (iterator.hasNext()) {
23            Map.Entry me2 = (Map.Entry) iterator.next();
24            System.out.print(me2.getKey() + ": ");
25         System.out.println(hmap.get(me2.getKey()).firstName + " "+hmap.get(me2.getKey()).lastName );
26
27        }
28    }

输出:

11: Ajay Gupta
29: Jayant Verma
36: Mohan Sharma
455: Rahul Dev

Custom Comparator

结论

本教程涵盖了按值对 HashMap 的排序。对字符串值的排序不同于整数值。对字符串值的排序需要比较器,而对整数值则直接使用 Collection.sort()进行排序。

Published At
Categories with 技术
Tagged with
comments powered by Disqus