介绍:
在本教程中,我们将学习如何对Java HashMap进行排序。 我们可以按键或按值对HashMap进行排序。 我们将讨论这两种策略。
对Java
为了跟上本文的其余部分,我们首先构造一个HashMap:
HashMap<Integer, Student> map = new HashMap<>();
map.put(1003, new Student(1003, "Sam"));
map.put(1005, new Student(1005, "Joseph"));
map.put(1001, new Student(1001, "Kate"));
map.put(1002, new Student(1002, "Miranda"));
map.put(1004, new Student(1004, "Peter"));
其中Student是一个具有ID和名称作为其字段的POJO:
class Student {
private Integer id;
private String name;
Student(Integer id, String name) {
this.id = id;
this.name = name;
}
public String toString() {
return "[id="+id + ", name=" + name + "]";
}
}
现在,让我们看一下可以对HashMap进行排序的不同方法:
1.使用
众所周知, TreeMap是一个排序的Map ,默认情况下,元素是根据其键的自然顺序进行排序的。 因此,一种基本方法是将所有元素从HashMap推送到TreeMap:
TreeMap<Integer, Student> sortedMap = new TreeMap<>(map);
//Or else
TreeMap<Integer, Student> sortedMap = new TreeMap<>();
sortedMap.putAll(map);
请注意, 我们可以将原始HashMap本身传递到构造函数中,也可以使用putAll()方法。 这样,我们的sortedMap将按键值的排序顺序保存元素:
{1001=[id=1001, name=Kate], 1002=[id=1002, name=Miranda]
, 1003=[id=1003, name=Sam], 1004=[id=1004, name=Peter]
, 1005=[id=1005, name=Joseph]}
2.使用ArrayList:
如果我们只需要排序的键或值,而不真正在乎Map ,则可以使用ArrayList。
在这里,我们将首先将键或值提取到ArrayList中 ,然后使用Collections.sort()对列表进行排序:
List<Integer> mapKeys = new ArrayList<>(map.keySet());
Collections.sort(mapKeys);
//Or
List<Student> mapValues = new ArrayList<>(map.values());
Collections.sort(mapValues);
在这里,仅当我们的学生实现Comparable时,才可以按值对Map进行排序:
public class Student implements Comparable<Student> {
...
public int compareTo(Student other) {
return this.id.compareTo(other.id);
}
}
之所以如此,是因为我们地图中的值是一个自定义类型对象– Student 。
3.使用TreeSet:
如果我们还打算避免在键或值的结果列表中出现任何重复,则可以选择TreeSet:
SortedSet<String> mapKeys = new TreeSet<>(map.keySet());
同样,我们可以创建一组排序的地图值。 但是, 我们必须重写equals()和hashCode()方法,以使其适用于自定义对象。
4. Java 8流:
从Java 8开始,我们可以使用Stream API对地图进行排序。 要使用键对Java Map进行排序,我们需要:
Map<Integer, Student> sortedMap = map.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors
.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
在这里, 我们将排序后的地图收集到LinkedHashMap中,以保留排序后的order 。
同样,要按值对地图进行排序,我们将使用compareByValue() :
sortedMap = map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors
.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
通常,在处理自定义对象时,该对象必须实现Comparable接口。
我们有一篇有关Java 8 Collectors的详细文章,它将帮助您了解Collectors.toMap()方法的用法。
为了按降序对地图进行排序,我们可以简单地使用Collections.reverseOrder():
sortedMapDesc = map.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByKey()))
.collect(Collectors
.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
让我们在控制台上打印sortedMapDesc :
{1005=[id=1005, name=Joseph], 1004=[id=1004, name=Peter],
1003=[id=1003, name=Sam], 1002=[id=1002, name=Miranda],
1001=[id=1001, name=Kate]}
如我们所见,现在地图按键降序排列。
结论:
在本文中,我们介绍了使用TreeMap,ArrayList或TreeSet对Java HashMap进行排序的各种方法。 我们还介绍了Java 8 Stream API sorted()方法,该方法可以帮助我们按键或值对地图进行排序。
成为第一个发表评论的人。
翻译自: https://www.javacodegeeks.com/2019/03/sorting-hashmap-java.html