I'm new to Java and learning about Collections. As an exercise, I'm trying to sort a SortedMap using a custom Comparator. I'd like to be able sort the students SortedMap by average of grades in descending order.
SortedMap <String, Student> students = new TreeMap <String, Student> ();
public class Student {
private String name;
private List<Integer> marks = new ArrayList<Integer>();
public Student(String n) {
this.name = n;
}
public String getName() {
return this.name;
}
public Double getAvg() {
return this.getStats()
.getAverage();
}
public void addMark(Integer mark) {
this.marks.add(mark);
}
public DoubleSummaryStatistics getStats() {
return this.marks.stream()
.mapToDouble(mark -> mark)
.summaryStatistics();
}
@Override
public String toString() {
return this.name + " " + getStats().getCount() + " " + getStats().getAverage();
}
}
I was able to figure out how to build a custom comparator that returns a set:
SortedSet<Map.Entry<String, Student>> meritSet = new TreeSet<Map.Entry<String, Student>>(
new Comparator<Map.Entry<String, Student>>() {
@Override
public int compare(Map.Entry<String, Student> s1,
Map.Entry<String, Student> s2) {
Double s1Avg = students.get(s1.getKey()).getStats().getAverage();
Double s2Avg = students.get(s2.getKey()).getStats().getAverage();
return s1Avg.compareTo(s2Avg);
}
}
);
meritSet.addAll(students.entrySet());
How would I code a custom comparator that returns a SortedMap and not a SortedSet?