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)
,因为您没有实例方法。
基本上,我有 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)
,因为您没有实例方法。