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

2022-09-01 12:59:58

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

我需要编写一个方法,该方法将比较姓氏和名字,以便列表可以按姓氏的字母顺序排序,然后如果两个人具有相同的姓氏,那么它将对名字进行排序。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;
}

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


答案 1

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

int studentCompare = this.lastName.compareTo(s.getLastName()); 

这甚至不会编译:

if (this.getLastName() < s.getLastName())

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

因此,要比较拳头/姓氏顺序,您需要:

int d = getFirstName().compareTo(s.getFirstName());
if (d == 0)
    d = getLastName().compareTo(s.getLastName());
return d;

答案 2

compareTo 方法描述如下:

将此对象与订单的指定对象进行比较。返回负整数、零或正整数,因为此对象小于、等于或大于指定的对象。

假设我们想按年龄比较绝地武士:

class Jedi implements Comparable<Jedi> {

    private final String name;
    private final int age;
        //...
}

然后,如果我们的绝地武士比提供的绝地武士年长,你必须返回一个正数,如果他们的年龄相同,则返回0,如果我们的绝地武士更年轻,则返回负数。

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

通过实现方法(来自接口),您正在定义所谓的自然顺序默认情况下,JDK 中的所有排序方法都将使用此排序。compareToComparable

在一些 ocassions 中,您可能希望将比较基于其他对象,而不是基元类型。例如,根据他们的名字来应对Jedis。在这种情况下,如果正在比较的对象已经实现,那么您可以使用其方法进行比较。ComparablecompareTo

public int compareTo(Jedi jedi){
    return this.name.compareTo(jedi.getName());
}

在这种情况下,它会更简单。

现在,如果您决定同时使用姓名和年龄作为比较标准,那么您必须决定您的比较对象,什么是优先的。例如,如果两个绝地武士的名字相同,那么你可以用他们的年龄来决定哪个先走,哪个排在第二位。

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

如果你有一系列绝地武士

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..}

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

Arrays.sort(jediAcademy);

此方法将使用您的方法对对象逐个排序。Arrays.sortcompareTo


推荐