按键自定义排序的地图

时间:2019-07-09 04:33:09

标签: java java-8

我们有一个地图的对象键-Map<Student,List<Subject>>:

class Student {
  String admitDate; //20190702
  String name;
  .....
}

在特定触发条件下,我们希望根据学生的入学日期(日期)对地图进行排序-并删除最早的入学时间。
Student的equals和hashcode具有不同的比较-因此它不能是通用排序。
我们使用Java8。
实现这一目标的最少代码方式是什么?

2 个答案:

答案 0 :(得分:0)

您必须使用两件事:

  1. 自定义比较器
  2. 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);
}