java - 如何编写自定义比较器来对 SortedMap 进行排序?

标签 java

我是 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/

相关文章:

java - JUnitParamsRunner 与 Guice

java - 如何使用Gson解析扩展基类的指定类?

java - Java中如何为类成员函数分配内存

java - 一个类可以调用类中的另一个函数,而第一个类不需要知道它是哪个类吗

Java套接字程序用于客户端和服务器通信自动重连

java - 对返回语句中未经检查的强制转换发出警告

java - Java分割后修改bigInteger

java - 使用 sshj 返回 Shell 返回值

java - Java中的方法重载

Java,什么是底层文档