我们有一个地图的对象键-Map<Student,List<Subject>>:
class Student {
String admitDate; //20190702
String name;
.....
}
在特定触发条件下,我们希望根据学生的入学日期(日期)对地图进行排序-并删除最早的入学时间。
Student的equals和hashcode具有不同的比较-因此它不能是通用排序。
我们使用Java8。
实现这一目标的最少代码方式是什么?
答案 0 :(得分:0)
您必须使用两件事:
Map
实现支持排序-TreeMap
。请参见下面的代码段
// this is comparator that sorte `Student` accorgind to their `adminDate` ascending order
Comparator<Student> sortByAdminDateAsc = Comparator.comparingInt(one -> Integer.parseInt(one.adminDate));
// Use `TreeMap` with given comparator
Map<Student, List<Subject>> studentSubjects = new TreeMap<>(sortByAdminDateAsc);
// fill the map
studentSubjects.forEach((student, subjects) -> {
// student are sorted according to comparator
});
如果您已经拥有HashMap
,则可以执行smth。像这样:
Map<Student, List<Subject>> studentSubjects = new HashMap<>();
Set<Student> sortedKeys = studentSubjects.keySet().stream().sorted(sortByAdminDateAsc).collect(Collectors.toSet());
重要:使用带有自定义比较器的方法,您将不依赖于学生的equals和哈希码的内部实现。此外,您可以出于不同目的使用尽可能多的比较器。
答案 1 :(得分:0)
尝试此操作,将下面的代码中的String替换为Student并将Integer替换为List
private static void sortBasedOnKey(Map<String, Integer> input) {
List<Map.Entry<String, Integer>> list= new ArrayList<>(input.entrySet());
Collections.sort(list, (obj1, obj2) -> obj1.getKey().compareTo(obj2.getKey()));
Map<String, Integer> resultMap = new LinkedHashMap<>();
list.forEach(obj -> resultMap.put(obj.getKey(), obj.getValue()));
System.out.println(resultMap);
}