如何编写比较对象的compareTo方法?

Jer*_*y B 29 java compareto comparable

我正在学习数组,基本上我有一个收集姓氏,名字和分数的数组.

我需要编写一个compareTo方法来比较姓氏和名字,以便列表可以按字母顺序从姓氏开始排序,然后如果两个人的姓氏相同,那么它将对第一个名称进行排序.

我很困惑,因为我书中的所有信息都是比较数字,而不是对象和字符串.

这是我到目前为止编码的内容.我知道这是错的,但它至少解释了我认为我在做什么:

public int compare(Object obj) // creating a method to compare 
{   
    Student s = (Student) obj; // creating a student object

    // I guess here I'm telling it to compare the last names?
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0)
        return studentCompare;
    else 
    {
        if (this.getLastName() < s.getLastName())
            return - 1;

        if (this.getLastName() > s.getLastName())
            return 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道<>符号是错误的,但就像我说我的书只告诉你如何使用compareTo.

Eug*_*sky 24

这是比较字符串的正确方法:

int studentCompare = this.lastName.compareTo(s.getLastName()); 
Run Code Online (Sandbox Code Playgroud)

这甚至不会编译:

if (this.getLastName() < s.getLastName())
Run Code Online (Sandbox Code Playgroud)

if (this.getLastName().compareTo(s.getLastName()) < 0)改用.

所以要比较你需要的拳头/姓氏顺序:

int d = getFirstName().compareTo(s.getFirstName());
if (d == 0)
    d = getLastName().compareTo(s.getLastName());
return d;
Run Code Online (Sandbox Code Playgroud)


Edw*_*rzo 18

compareTo方法描述如下:

将此对象与指定的对象进行比较以获得顺序.返回负整数,零或正整数,因为此对象小于,等于或大于指定对象.

假设我们想按照他们的年龄比较Jedis:

class Jedi implements Comparable<Jedi> {

    private final String name;
    private final int age;
        //...
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我们的绝地比所提供的更早,你必须返回一个积极的,如果他们是相同的年龄,你返回0,如果我们的绝地年轻,你返回负面.

public int compareTo(Jedi jedi){
    return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
}
Run Code Online (Sandbox Code Playgroud)

通过实现该compareTo方法(来自Comparable界面),您可以定义所谓的自然顺序.默认情况下,JDK中的所有排序方法都将使用此排序.

在某些情况下,您可能希望将比较基于其他对象,而不是基本类型.例如,copare Jedis基于他们的名字.在这种情况下,如果要比较的对象已经实现,Comparable那么您可以使用其compareTo方法进行比较.

public int compareTo(Jedi jedi){
    return this.name.compareTo(jedi.getName());
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下会更简单.

现在,如果你想使用名称和年龄作为比较标准,那么你必须决定你的比较,优先级是什么.例如,如果两个Jedis的名称相同,那么您可以使用它们的年龄来决定哪个先行,哪个先行.

public int compareTo(Jedi jedi){
    int result = this.name.compareTo(jedi.getName());
    if(result == 0){
        result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果你有一组Jedis

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..}
Run Code Online (Sandbox Code Playgroud)

您所要做的就是要求班级java.util.Arrays使用其排序方法.

Arrays.sort(jediAcademy);
Run Code Online (Sandbox Code Playgroud)

Arrays.sort方法将使用您的compareTo方法逐个对对象进行排序.