当前位置: 首页 > 知识库问答 >
问题:

如何在Java中实现compareTo方法,这是什么意思[重复]

呼延英奕
2023-03-14

我对java很陌生。我知道Java可比接口只有一个方法,它有一个int返回类型。但是,当我想覆盖compareTo方法时,我不确定我实际上在做什么。理解编程而不仅仅是记住它对我来说很重要。

例如,在下面的代码中,我们有一个int变量“spaceshipClassComparison”,它等于“this.spaceshipClass.comparieto(other.spaceshipClass)”。我知道这个方法返回的值是1,0,-1,但我不明白当我们再次为此调用compareTo()时我们在做什么。宇宙飞船,但这次有了一个新的物体,它是如何变成整数的?

public class Spaceship implements Comparable<Spaceship> {

    private String spaceshipClass = null;
    private String registrationNo = null;

    public Spaceship(String spaceshipClass, String registrationNo) {
        this.spaceshipClass = spaceshipClass;
        this.registrationNo = registrationNo;
    }

    @Override
    public int compareTo(Spaceship other) {
        int spaceshipClassComparison =
                this.spaceshipClass.compareTo(other.spaceshipClass);

        if(spaceshipClassComparison != 0) {
            return spaceshipClassComparison;
        }
        
        return this.registrationNo.compareTo(other.registrationNo);
    }
}    

共有2个答案

龙德润
2023-03-14

compareTo方法用于在类的元素之间建立自然排序。这是一个扩展自然排序概念的链接。

https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

回到您的示例,我认为您在理解它的想法时遇到了困难,因为您正在比较两个String对象,它们依次调用它们的compareTo实现,该实现在幕后执行其他操作。基本上,它们只是执行字母比较以确定当前字符串是否低于、等于或大于给定参数

不过,让我们用另一个类来做一个更简单的例子。假设我们有一个Person类,它只包含名字、姓氏和年龄,我们希望通过比较不同年龄的人来建立其自然顺序。

class Person implements Comparable<Person> {
    private String name, lastName;
    private int age;

    public Person(String name, String lastName, int age) {
        this.name = name;
        this.lastName = lastName;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(Person otherPerson) {
        //If the current person's age is lower than otherPerson's age than we return -1, as the current person is "lower" than the other (ordering-wise)
        if (age < otherPerson.getAge()) {
            return -1;
        }

        //If the current person's age is equal to the otherPerson's age than we return 0, as the current person is "equal" to the other (ordering-wise)
        if (age == otherPerson.getAge()) {
            return 0;
        }

        //Here, there are no other cases left so the current person's age is greater than the otherPerson's age, so we return 1.
        return 1;
    }

    public static void main(String[] args) {
        Person p1 = new Person("Matt", "O'Brien", 20);
        Person p2 = new Person("Matt", "O'Brien", 25);
        Person p3 = new Person("George", "Lucas", 25);

        System.out.println(p1.compareTo(p2));   //Prints -1 because 20 is lower than 25
        System.out.println(p2.compareTo(p1));   //Prints 1 because 25 is greater than 20
        System.out.println(p2.compareTo(p2));   //Prints 0 because 20 is equal to 20 even though we're comparing different people, because in the comprateTo we're only confronting the age
    }
}

您在compareTo示例中所做的基本上是在Spacship元素之间建立自然排序,首先是它们的类,然后是它们的编号。事实上,如果它们类的字母顺序与0不同,则立即返回此值。否则,如果它们的类相同,则执行另一个比较(通过注册号)并返回其值。

public int compareTo(Spaceship other) {
    //Saving the comparison value between the spaceships' class
    int spaceshipClassComparison =
            this.spaceshipClass.compareTo(other.spaceshipClass);

    //If they are already different by class we return the ordering value (no point in comparing also the number)
    if(spaceshipClassComparison != 0) {
        return spaceshipClassComparison;
    }
    
    //If the spaceships have the same class then we return the comparison between their registration number
    return this.registrationNo.compareTo(other.registrationNo);
}
邴子实
2023-03-14

在比较数字等显而易见的东西时,我们不需要自定义的比较方法。例如,如果我们想知道2是否大于1,我们只需要使用合适的运算符:2

然而,当我们处理明显没有可比性的东西时,比如物体和宇宙飞船(在您的示例中),我们需要向编译器解释使用什么标准来表示一艘宇宙飞船比另一艘“大”。

这就是编写自html" target="_blank">定义(@Override)compareTo方法的用武之地。默认情况下,compareTo方法返回1、0或-1。这些数字没有内在的意义,事实上它们可以是你喜欢的任何数字(只要它们不同)。它们的目的是在比较两种情况时匹配三种情况:

  • 第一件事比第二件事大

您示例中的compareTo方法指定当我们比较两个宇宙飞船时,我们将使用它们的宇宙飞船类的字符串值。此外,您示例中的compareTo方法使用比较字符串的默认实现:这意味着字符串是按字典顺序比较的(您可以将其视为字母顺序)。

 类似资料:
  • 问题内容: 我写Java已有一段时间了,今天我遇到了以下声明: 请注意数组声明中的“点点点”,而不是通常的括号[]。显然可以。实际上,我写了一个小测试并验证了它的有效性。因此,我提取了Java语法,以查看参数声明语法的位置,但未找到任何内容。 那么对那里的专家来说,这是如何工作的呢?它是语法的一部分吗?另外,虽然我可以像这样声明函数,但不能像这样在函数体内声明数组。 无论如何,您知道在哪里记录了此

  • 我很难理解<代码> 结果是15 但是怎么会变成15呢?

  • 请帮助我理解这个表达是什么意思?

  • 我不知道问号(< code >?)在java里代表,我在做一个小程序,一个Nim-game。我们在一本书里寻求帮助,看到了这样一句话: 我不明白,表示,它可以与if语句有关但您将其放在变量中吗?并且可以是“其他”?(我刚才说的这些事情可能会很误导)

  • 我注意到写作是完全合法的 但我不清楚它的语义。它实际上做什么?我希望它的意思是“X是一个类的名称,但我们将使用它作为接口”,但我注意到您可以这样写: 这意味着实现X并没有添加它。那么它又增加了什么呢?

  • 问题内容: 我是Go的新手,在浏览其他一些线程时遇到了以下代码行: 含义是什么?它是否指定将在if条件中分配某些内容(因为err似乎正在发生这种情况)?我在Wiki上找不到这种语法的示例,并且我很好奇它的用途。 问题答案: 因为返回两个值,所以如果需要它们中的任何一个,都必须在某个地方接收这些值。该是一个占位符,基本的意思是“我不关心这个特殊的返回值。” 在这里,我们只关心检查错误,而无需对实际的