compareTo() 方法的实现问题

Problems with implimention of the compareTo() method

基本上,我有 2 个 classes。其中之一有一个私有成员 ArrayList(Objects from the other class) 并且列表中的每个对象都有一个私有字段点。我有一种方法可以遍历列表并获得所有点的总和。所以我只想比较 list1 > list2 的总和。但我没能做到这一点——我的 compareTo() returns 总是 0.

这是一个简短的代码示例。

public class StudentsGroup implements IFile, Comparable {
    private List<Student> studentsList = new ArrayList<Student>();


    public int compareTo(Object o) {
        if(StudentsGroup.getTotalPoints(studentsList) < ((StudentsGroup)o).getTotalPoints(studentsList))
            return 1;
        else if(StudentsGroup.getTotalPoints(studentsList) > ((StudentsGroup)o).getTotalPoints(studentsList))
            return -1;
        else 
            return 0;
    }

    public static int getTotalPoints(List<Student> studentsList1) {
        int totalPoints = 0;
        for(Student o : studentsList1) {
            totalPoints += o.getStudentPoints();
        }
        return totalPoints;
    }
}

方法

 if(
  StudentsGroup.getTotalPoints(studentsList) <   
  ((StudentsGroup)o).getTotalPoints(studentsList))

您将相同的 studentsList 传递给计算的两边。

"other group" o根本就没用过

它可能看起来像使用了 o,但 getTotalPoints 是一个 static 方法,无论您在哪个实例上调用它都没有关系。编译器也会对此发出警告。 不要忽略编译器警告。

立即解决方法是将代码更改为

if( getTotalPoints(studentsList) < getTotalPoints((StudentsGroup)o).studentsList)

但是您应该将 getTotalPoints 方法从 public static 更改为 public(非静态)。与其将列表作为参数传递,不如在内部使用 this.studentsList

if (this.getTotalPoints() < ((StudentsGroup)o).getTotalPoints())

在那种情况下,我会检查值是否相同(或均为 0)

public class StudentsGroup implements IFile, Comparable<StudentsGroup> {
    private List<Student> studentsList = new ArrayList<Student>();


    public int compareTo(StudentsGroup sg) {
        return Integer.compare(getTotalPoints(), sg.getTotalPoints());
    }

    public int getTotalPoints() {
        return Math.toIntExact(studentsList.stream()
                                           .mapToInt(Student::getStudentPoints).sum());
    }
}

通过简化代码,您不太可能混淆静态方法和实例方法 (StudentsGroup)o).getTotalPoints(studentsList) 只需调用 StudentsGroup.getTotalPoints(studentsList),因为您没有实例方法。