Search code examples
javacomparable

Problems with implimention of the compareTo() method


Basically, I have 2 classes. One of them has a private member ArrayList(Objects from the other class) and every object from the list has a private field points. I have a method to iterate through the list and get the sum of all points. So I just want to compare list1 > list2 by their summed points. But I'm failing to achieve that - my compareTo() returns always 0.

Here is a short code example of this.

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;
    }
}

The method


Solution

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

    You are passing the same studentsList to both sides of the calculation.

    The "other group" o is not used at all.

    It may look like o is used, but getTotalPoints is a static method and it does not matter what instance you call it on. The compiler will give you a warning about this, too. Do not ignore compiler warnings.

    Immediate fix would be to change the code to

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

    But you should probably change that getTotalPoints method from public static to public (not-static). Instead of the list being passed as a parameter, it can then just use this.studentsList internally.

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