How to override compareTo (Java)

aLittleMind picture aLittleMind · Mar 17, 2017 · Viewed 45.7k times · Source

I'm a beginner in programming and I have two classes. First class is:

public class User implements Comparable<User>

with field int age, constructor and overrided method of interface Comparable:

 @Override
    public int compareTo(User user) {
        return user.age >= age ? -1 : 0;
    }

Second class is public class SortUser with a method to make a Set collection from a List:

public Set<User> sort(List<User> list) {
        Set<User> result = new TreeSet<>();
        for (User user : list) {
            result.add(user);
        }
        return result;
    }

It seems to me that all User objects in a Set should be sorted, but when I made a List with 3 User objects...

 User a = new User(1);
 User b = new User(2);
 User c = new User(3);
 List<User> list = new ArrayList<>();
 list.add(c);
 list.add(a);
 list.add(b);

(Now the list's order is: 312) ...and created a Set (TreeSet) from that list:

SortUser sortUser = new SortUser();
Set<User> set = sortUser.sort(list);

At the end I have a set with that order: 13, it means that only two objects are in the set. What is going wrong?

Answer

Roma Khomyshyn picture Roma Khomyshyn · Mar 17, 2017

As I see you have wrong implementation of compare method. Could you update it to?

@Override
public int compareTo(User user) {
  return Integer.compare(age, user.age);
}