在Java中如何根据值对HashMap进行排序?
Java中的HashMap提供快速查找。它们以”键,值”对形式存储项目。要从HashMap中获取一个值,我们使用与该条目对应的键。
HashMap是实现字典和目录的好方法。
键和值可以是不同类型的(例如,字符串、整数)。
我们可以根据键和值来对HashMap中的条目进行排序。
在本教程中,我们将根据值对HashMap进行排序。
基本策略是从HashMap中获取值并将其放入列表中进行排序。如果Value的数据类型是String,我们将使用比较器对列表进行排序。要了解更多关于比较器的信息,请阅读本教程。
一旦我们按照顺序排列的方式获得值的列表,我们再次根据这个新的列表构建HashMap。
让我们来看一下代码。
HashMap按值排序的简单示例
我们首先将字符串值放入一个列表中,然后对该列表进行排序。
为了对列表中的字符串值进行排序,我们使用一个比较器。这个比较器按字母顺序对值列表进行排序。
Collections.sort(list, new Comparator<String>() {
public int compare(String str, String str1) {
return (str).compareTo(str1);
}
});
在我们排序完列表之后,我们根据这个排序好的列表构建 HashMap。
完整的代码如下:
package com.scdev.collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
LinkedHashMap<String, String> sortedMap = new LinkedHashMap<>();
ArrayList<String> list = new ArrayList<>();
map.put("2", "B");
map.put("8", "A");
map.put("4", "D");
map.put("7", "F");
map.put("6", "W");
map.put("19", "J");
map.put("1", "Z");
for (Map.Entry<String, String> entry : map.entrySet()) {
list.add(entry.getValue());
}
Collections.sort(list, new Comparator<String>() {
public int compare(String str, String str1) {
return (str).compareTo(str1);
}
});
for (String str : list) {
for (Entry<String, String> entry : map.entrySet()) {
if (entry.getValue().equals(str)) {
sortedMap.put(entry.getKey(), str);
}
}
}
System.out.println(sortedMap);
}
}
輸出 :將以下內容用中文進行改寫,僅需提供一種選擇:
{8=A, 5=B, 3=D, 7=F, 10=J, 2=W, 1=Z}
HashMap的条目按照字符串值进行排序。
对HashMap按值进行排序的另一个示例。
如果HashMap中的值是整型(Integer)的话,代码将如下所示:
package com.JournalDev;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
LinkedHashMap<String, Integer> sortedMap = new LinkedHashMap<>();
ArrayList<Integer> list = new ArrayList<>();
map.put("A", 5);
map.put("B", 7);
map.put("C", 3);
map.put("D", 1);
map.put("E", 2);
map.put("F", 8);
map.put("G", 4);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
list.add(entry.getValue());
}
Collections.sort(list);
for (int num : list) {
for (Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue().equals(num)) {
sortedMap.put(entry.getKey(), num);
}
}
}
System.out.println(sortedMap);
}
}
输出:产出
{D=1, E=2, C=3, G=4, A=5, B=7, F=8}
这里HashMap的数值按照整数数值排序。
使用自定义比较器对HashMap进行排序
如果你注意到上面的例子,Value对象实现了Comparator接口。让我们来看一个我们的值是一个自定义对象的例子。
我们还可以创建一个自定义比较器来根据值对哈希映射进行排序。当值是自定义对象时,这将非常有用。
让我们举一个例子,假设值是一个名为“名称”的类。这个类有两个参数,分别是名字和姓氏。
Name类的代码是:
package com.JournalDev;
public class Name {
String firstName;
String lastName;
Name(String a, String b){
firstName=a;
lastName=b;
}
public String getFirstName() {
return firstName;
}
}
自定义的比较器将类似于:
Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());
我们正在按照名字的顺序来排序,我们也可以使用姓氏来排序。不使用列表来从地图中获取值,我们将使用LinkedHashMap来直接创建已排序的哈希映射。
完整的代码为:
public static void main(String[] args) {
HashMap<Integer, Name> hmap = new HashMap<Integer, Name>();
Name name1 = new Name("Jayant", "Verma");
Name name2 = new Name("Ajay", "Gupta");
Name name3 = new Name("Mohan", "Sharma");
Name name4 = new Name("Rahul", "Dev");
hmap.put(9, name1);
hmap.put(1, name2);
hmap.put(6, name3);
hmap.put(55, name4);
Comparator<Name> byName = (Name obj1, Name obj2) -> obj1.getFirstName().compareTo(obj2.getFirstName());
LinkedHashMap<Integer, Name> sortedMap = hmap.entrySet().stream()
.sorted(Map.Entry.<Integer, Name>comparingByValue(byName))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
//printing the sorted hashmap
Set set = sortedMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry me2 = (Map.Entry) iterator.next();
System.out.print(me2.getKey() + ": ");
System.out.println(hmap.get(me2.getKey()).firstName + " "+hmap.get(me2.getKey()).lastName );
}
}
产出: 输出
1: Ajay Gupta
9: Jayant Verma
6: Mohan Sharma
55: Rahul Dev
结论
本教程介绍了根据值对HashMap进行排序。根据字符串值进行排序与根据整数值进行排序有所不同。字符串值需要使用比较器进行排序。而整数值则直接使用Collection.sort()进行排序。