我对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);
}
}
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);
}
在比较数字等显而易见的东西时,我们不需要自定义的比较方法。例如,如果我们想知道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上找不到这种语法的示例,并且我很好奇它的用途。 问题答案: 因为返回两个值,所以如果需要它们中的任何一个,都必须在某个地方接收这些值。该是一个占位符,基本的意思是“我不关心这个特殊的返回值。” 在这里,我们只关心检查错误,而无需对实际的