我是 Java 的新手,正在学习集合。作为练习,我正在尝试使用自定义比较器对 SortedMap 进行排序。我希望能够按平均成绩降序对学生 SortedMap 进行排序。
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();
}
}
我能够弄清楚如何构建一个返回集合的自定义比较器:
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());
我如何编写返回 SortedMap 而不是 SortedSet 的自定义比较器?
最佳答案
您要做的是根据它的值对 Map
进行排序。
然而,这不是 SortedMap
可以实现的。 .
A Map that further provides a total ordering on its keys.
如果您只想将它们排序存储在 Map
中,而不需要在您添加新值时仍然对 Map
进行排序,您可以将所有条目存储在 LinkedHashMap
中:
Map<String, Studen> meritMap = meritSet.stream()
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> a, LinkedHashMap::new));
虽然这不会为您提供 SortedMap
,但是 Map
将被排序。
关于java - 如何编写自定义比较器来对 SortedMap 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59307434/