如何覆盖 compareTo (Java)

How to override compareTo (Java)

我是编程初学者,我有两个 classes。首先class是:

public class User implements Comparable<User>

具有字段int age、构造函数和接口 Comparable 的重写方法:

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

第二个 class 是 public class SortUser 使用从列表创建集合的方法:

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

在我看来,Set 中的所有 User 个对象都应该排序,但是当我创建一个包含 3 个 User 个对象的列表时...

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

(现在列表的顺序是:312) ...并从该列表中创建了一个 Set (TreeSet):

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

最后我有一个 set 的顺序是:13,这意味着 set 中只有两个对象。出了什么问题?

据我所知,您对比较方法的实现有误。你能把它更新到吗?

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

您对 TreeSet 所做的操作是不必要的。我不确定他们在迭代时是否保证有一定的顺序。

只需将您的排序方法替换为

Collections.sort(list)

我猜测元素被删除的原因是你的 compareTo 方法在任何情况下都不会 returns 一个 1,所以元素总是被认为小于或等于其他元素,这可能与TreeSet有关。

用户class

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

准备名单

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

用于排序

 Set<User> list1 = new TreeSet(list);

请遵循以下方法

如果是字符串。

    public static Comparator<Employee> NameComparator = new Comparator<Employee>() {
    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.getName().compareTo(e2.getName());
    }
};

如果是整数值

public static Comparator<Employee> SalaryComparator = new Comparator<Employee>() {

    @Override
    public int compare(Employee e1, Employee e2) {
        return (int) (e1.getSalary() - e2.getSalary());
    }
};
class Scratch {
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(3));
        list.add(new User(1));
        list.add(new User(2));
        Collections.sort(list);
        list.forEach(el -> System.out.println(el.age));
    }
}

class User implements Comparable<User> {
    int age;

    User(int age) {
        this.age = age;
    }

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

您可能想试试这个:

@Override
public int compareTo(User user) {
  if (this == user){
     return 0;
  }
  if (user != null){
     return this.age.compareTo(user.getAge())
  }
}