Java 实现自定义比较
这是我的Java 实现自定义比较,java,compareto,Java,Compareto,这是我的compareTo方法实现,用于根据两个Student对象的名称对其进行比较。是否可以基于多个字段(即姓名和年龄)比较两个这样的对象?是的,可以使用Comparator接口compare方法基于不同的排序顺序比较两个对象 您需要创建一个排序序列类 是的,但是首先您应该键入正在实现的可比较接口。下面是它的外观: @Override public int compareTo(Object t) { if(t instanceof Student) { Stu
compareTo
方法实现,用于根据两个Student
对象的名称对其进行比较。是否可以基于多个字段(即姓名和年龄)比较两个这样的对象?是的,可以使用Comparator
接口compare
方法基于不同的排序顺序比较两个对象
您需要创建一个排序序列类 是的,但是首先您应该键入正在实现的可比较接口。下面是它的外观:
@Override
public int compareTo(Object t)
{
if(t instanceof Student)
{
Student s = (Student)t;
return (this.name.compareTo(s.name));
}
else
return -1;
}
公共班级学生实施可比{
私人互联网;
私有字符串名称;
@凌驾
公共int比较(学生s){
如果(名称等于(s.name))
返回年龄-s.age;
返回name.compareTo(s.name));
}
}
请注意,使用类型化接口Comparable
,而不是原始类型Comparable
,无需强制转换。请注意,您是上述代码中的compareTo
方法,而不是覆盖它
您正在实现的接口
:
public class Student implements Comparable<Student> {
private int age;
private String name;
@Override
public int compareTo(Student s) {
if (name.equals(s.name))
return age - s.age;
return name.compareTo(s.name));
}
}
该接口的原始作者Josh Bloch在他的书中建议仅出于这个原因使用@Override
注释;重载导致的错误可能很难发现
你说你想“基于多个字段”比较这些对象——我不确定这是指“基于两个字段按一种方式排序”还是“基于单个字段按多种方式排序”。这两种方法都是可能的,正如这里的其他答案所示
然而,这是底线:
如果您自己正在创建一个类,并且希望为这个类定义一个“自然顺序”,那么您应该实现Comparable
。如果您想定义多个排序,或者您不控制所讨论的类,请在实现Comparator
(请参阅)的类中定义您自己的排序。Apache类值得一提
您可以使用反射或不使用反射来实现
@Override
public int compareTo(Object t) {
//...
}
您还可以告诉我
Collections.sort()
与通过添加到TreeSet
中获得已排序集合之间的区别吗?@AnjanBaradwaj,我觉得,与其提供模糊的答案,我希望您就此问这个问题,当然,通过一些努力和代码,我们都会从专家那里了解到:)它被认为是糟糕的样式,因为它让我们“不安全”(除非您使用instanceof
,这也是糟糕的样式),但在这种情况下,如果您正确地键入这个类,这完全是不必要的,这是好的样式。您的代码应尽可能使用窄键入。警告!上面的代码运行良好,因为年龄不应该是负值。但是当出现负值时要小心这是可能的。不要把上面的代码当作实现可比较(自然排序)的标准方法@FernandoPelliccioni实际上,这段代码对于年龄负值非常有效(你可以自己用笔和纸来验证)。允许负数带来的唯一漏洞是数字溢出,但作为一个问题,它需要数十亿的值——对于这样的dara来说,这种情况是可以忽略的。@Bohemian,你是对的,我做了错误的计算。对不起,吵闹了。但是,我们不应该把这个代码看作是为整数类型编写比较器的标准方式。我更喜欢:int result=name.compareTo(s.name);如果(结果==0)返回年龄-s.age;否则返回结果;
@Override
public int compareTo(Object t) {
//...
}
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare(this, o);
}