Пользовательский вид карты по ключу - PullRequest
0 голосов
/ 09 июля 2019

У нас есть ключ объекта к карте - Map<Student,List<Subject>>:

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

При определенном триггере мы хотели бы отсортировать карту на основе допустимой даты (в дате) студента - и удалитьсамое раннее признание / с.
Равенство и хэш-код Стьюдента имеют другое сравнение - так что это не может быть универсальный вид.
Мы на Java 8.
Каким будет наименьший код для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Попробуйте, замените 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);
}
0 голосов
/ 09 июля 2019

Вы должны использовать две вещи:

  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, тогда вы можете сделать что-нибудь. как это:

Map<Student, List<Subject>> studentSubjects = new HashMap<>();
Set<Student> sortedKeys = studentSubjects.keySet().stream().sorted(sortByAdminDateAsc).collect(Collectors.toSet());

Важное замечание: при использовании подхода с пользовательским компаратором вы не зависите от внутренней реализации равных и хэш-кода Стьюдента. Более того, вы можете использовать как можно больше компараторов для разных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...