TL; DR: Компаратор для TreeMap<Integer, Student>
должен сравнивать Integer
с, а не Student
с.
A TreeMap<Integer, Student>
отображается из целых чисел («ключи») в объекты учащихся («значения») и сохраняет сопоставления, отсортированные по целым числам. Поэтому конструктор не принимает Comparator<Student>
в качестве аргумента.
Согласно документации TreeMap<K,V>
, конструктор, принимающий компаратор в качестве аргумента, объявляется как
TreeMap(Comparator<? super K> comparator)
Это означает, что компаратор должен работать с типом K
, типом клавиш или некоторым супертипом K
. В вашем случае K
- это Integer
.
Поскольку класс Integer
уже определяет порядок, так называемый естественный порядок, я полагаю, вам вообще не нужен компаратор:
TreeMap<Integer, Student> map = new TreeMap<>();
Если вы хотите сохранить учеников по номеру roll
, просто вставьте их так:
Student me = new Student();
map.put(me.roll, me);
Побочным эффектом будет то, что карта отсортирована по roll
.
PS Информация в ответе Джона Кугельмана также верна, компаратору необходимо обработать три случая. И Comparator.comparingInt(s -> s.roll)
или Comparator.comparingInt(Student::getRoll)
(если класс имеет такой метод получения) рекомендуется не только для краткости, но даже больше, потому что он менее подвержен ошибкам.