Java compareTo()方法的实现问题

Java compareTo()方法的实现问题,java,comparable,Java,Comparable,基本上,我有两门课。其中一个有一个私有成员ArrayList(来自另一个类的对象),列表中的每个对象都有一个私有字段points。我有一个方法可以遍历列表并得到所有点的总和。所以我只想通过它们的总和来比较list1>list2。但我没有做到这一点——我的compareTo()总是返回0 下面是一个简短的代码示例 public class StudentsGroup implements IFile, Comparable { private List<Student> stu

基本上,我有两门课。其中一个有一个私有成员ArrayList(来自另一个类的对象),列表中的每个对象都有一个私有字段points。我有一个方法可以遍历列表并得到所有点的总和。所以我只想通过它们的总和来比较list1>list2。但我没有做到这一点——我的compareTo()总是返回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;
    }
}
公共类StudentsGroup实现IFile,可比较{
private List studentsList=new ArrayList();
公共整数比较对象(对象o){
if(StudentsGroup.getTotalPoints(studentsList)<((StudentsGroup)o.getTotalPoints(studentsList))
返回1;
else if(StudentsGroup.getTotalPoints(studentsList)>((StudentsGroup)o.getTotalPoints(studentsList))
返回-1;
其他的
返回0;
}
公共静态int getTotalPoints(列出学生列表1){
int totalPoints=0;
对于(学生o:学生1){
totalPoints+=o.getStudentPoints();
}
返回总分;
}
}
方法

 if(
  StudentsGroup.getTotalPoints(studentsList) <   
  ((StudentsGroup)o).getTotalPoints(studentsList))
但是您可能应该将
getTotalPoints
方法从
public static
更改为
public
(非静态)。然后,它可以在内部使用
this.studentsList
,而不是将列表作为参数传递

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

在这种情况下,我会检查两个值是否都相同(或都是0)

公共类StudentsGroup实现IFile,可比较{
private List studentsList=new ArrayList();
公共int比较(学生组sg){
返回整数.compare(getTotalPoints(),sg.getTotalPoints());
}
public int getTotalPoints(){
返回Math.toIntExact(studentsList.stream()
.mapToInt(Student::getStudentPoints.sum());
}
}

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

是否已推导以查看您正在比较的内容?你真的有学生名单上的条目吗?@Stultuske,是的,我有。我从.txt文件在构造函数中初始化它,并在列表中添加student类的对象。当我打印出totalPoints时,我说过实际的方法是有效的,但问题是list1.compareTo(list2)总是返回0,就好像列表在点上总是相等的,而不是相等的。另外请注意,
Comparable
上正确的泛型类型消除了对类型转换的需要。并且此代码不会计算两次每个和(原始代码可能必须这样做)。这也可以通过局部变量来实现。@Thilo我添加了Math.toIntExact,而不是
(int)
;)整洁。我的意思是你的代码中没有必要的
(StudentsGroup)o
强制转换(因为
Comparable
上的类型正确)。谢谢。我必须将该方法设置为静态,因为程序是赋值的,所以我猜我对静态方法的调用是错误的。顺便说一句,你需要在最后多放一个括号(“在更少的符号后面加一个”)”来关闭条件:
if (this.getTotalPoints() < ((StudentsGroup)o).getTotalPoints())
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());
    }
}