如何在Java中按值对HashMap排序?
Java中的HashMap提供了快速查找。
它们以"键,值"对存储项目。
要从HashMap获取值,我们使用与该条目对应的键。
HashMaps是实现字典和目录的好方法。
键和值可以具有不同的类型(例如,字符串,整数)。
我们可以根据键和值对HashMap中的条目进行排序。
在本教程中,我们将根据值对HashMap进行排序。
基本策略是从列表中的HashMap中获取值并对列表进行排序。
其中如果Value的数据类型为String,则使用比较器对列表进行排序。
要了解有关比较器的更多信息,请阅读本教程。
一旦获得排序后的值列表,我们将基于此新列表再次构建HashMap。
让我们看一下代码。
按值对HashMap进行排序的简单示例
我们首先在列表中获取String值。
然后,我们对列表进行排序。
为了对列表中的字符串值进行排序,我们使用了一个比较器。
该比较器按字母顺序对值列表进行排序。
Collections.sort(list, new Comparator<String>() { public int compare(String str, String str1) { return (str).compareTo(str1); } });
一旦我们对列表进行了排序,就可以基于此排序列表构建HashMap。
完整的代码如下:
package com.theitroad.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条目根据String值排序。
按值对HashMap排序的另一个示例
如果HashMap中的值是Integer类型,则代码如下:
package com.theitroad; 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值根据Integer值排序。
使用自定义比较器对HashMap排序
如果您注意到上述示例,则Value对象将实现Comparator接口。
让我们看一个示例,其中我们的值是一个自定义对象。
我们还可以创建一个自定义比较器,以根据值对哈希图进行排序。
当您的值是自定义对象时,这很有用。
让我们举一个例子,其中value是一个名为" Name"的类。
此类具有两个参数,firstName和lastName。
名称类的代码是:
package com.theitroad; 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());
我们根据名字对名字进行排序,我们也可以使用lastName进行排序。
我们将使用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