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