我怎样写一个compareTo方法进行比较的对象?我怎样写一个compareTo方法进行比较的对象?

2019-05-13 11:04发布

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

我需要写一个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

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


Answer 2:

compareTo方法描述如下:

相比之下,订单指定对象这个对象。 与此对象比指定的对象小于,等于或大于返回一个负整数,零或正整数。

比方说,我们希望通过他们的年龄比较Jedis:

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

通过实施compareTo方法(从未来的Comparable接口)你要定义什么是所谓的自然秩序 。 在JDK的所有排序方法将默认使用此排序。

有ocassions中,你可能希望你的基础比较中的其他对象,而不是一个原始类型。 例如,copare基于他们的名字Jedis。 在这种情况下,如果进行比较的对象已经实现了Comparable ,那么你可以使用它做比较compareTo方法。

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

这将是在这种情况下简单。

现在,如果你inted同时使用姓名和年龄作为比较的标准,那么你必须决定你比较奥德,什么优先。 举例来说,如果两个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;
}

如果你有Jedis数组

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

所有你需要做的就是要求对类java.util.Arrays使用它的排序方法。

Arrays.sort(jediAcademy);

Arrays.sort方法将使用您compareTo方法的对象逐一排序。



Answer 3:

听@milkplusvellocet,我建议你实现可比接口类为好。

只要有利于别人的答案:

String.compareTo()会告诉你一个字符串是如何不同的是从另一个。

例如System.out.println( "Test".compareTo("Tesu") ); 将打印-1 System.out.println( "Test".compareTo("Tesa") ); 将打印19

和书呆子和令人讨厌的单行解决这一任务将是:

return this.lastName.equals(s.getLastName()) ? this.lastName.compareTo(s.getLastName()) : this.firstName.compareTo(s.getFirstName());

说明:

this.lastName.equals(s.getLastName()) lastnames检查是否相同或不this.lastName.compareTo(s.getLastName())如果是,则返回姓氏的比较。 this.firstName.compareTo(s.getFirstName())如果不是,则返回第一个名称的比较。



Answer 4:

你在那里几乎所有的方式。

你的第几行,比较姓,是正确的轨道上。 上字符串的compareTo()方法将之前返回一个负数为按字母顺序排列的字符串,以及用于一个在后按字母顺序的正数。

现在,你只需要做同样的事,你的名字和分数。

换句话说,如果姓1 ==姓2,请在支票上下一您的名字。 如果第一个名字是一样的,选中你的分数。 (想想你的嵌套的if / then块)。



Answer 5:

考虑使用Comparator描述接口在这里它使用泛型这样就可以避免铸造ObjectStudent

正如尤金Retunsky说,你的第一个部分是比较正确的方式String秒。 此外,如果lastName s为等于我觉得你的意思比较firstName秒,在这种情况下,只需要使用compareTo以同样的方式。



Answer 6:

if (s.compareTo(t) > 0)将字符串s比较串T和返回你想要的int值。

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

        // compare last names
        return  this.lastName.compareTo(s.getLastName());    
    }

现在只是测试从方法的正负回报你会正常进行。

干杯



Answer 7:

字符串在Java中的对象。

你可以比较像这样,

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same


Answer 8:

我不会有一个Object类型的参数,它强制转换为学生,如果我们知道这将永远是Student类型没有任何意义。

作为一个解释,“结果== 0”只有当最后的名称相同发生,在这一点上,我们比较名字和返回值来代替。

public int Compare(Object obj)
{       
    Student student = (Student) obj;
    int result = this.getLastName().compareTo( student.getLastName() );

    if ( result == 0 )
    {
        result = this.getFirstName().compareTo( student.getFirstName() );
    }

    return result;
}


Answer 9:

如果您在使用比较中任何一类可比接口的方法。 这可以用来安排词典的字符串。

public class Student() implements Comparable<Student>{

public int compareTo(Object obj){
if(this==obj){
    return 0;
}
if(obj!=null){
    String objName = ((Student)obj).getName();
    return this.name.comapreTo.(objName);
}
}


文章来源: How do I write a compareTo method which compares objects?