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}
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}
在这里,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
结论
本教程涵盖了按值对 HashMap 的排序。对字符串值的排序不同于整数值。对字符串值的排序需要比较器,而对整数值则直接使用 Collection.sort()进行排序。