如何覆盖 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())
}
}
我是编程初学者,我有两个 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())
}
}