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

时间:2012-04-04 18:46:10

标签: java comparable compareto

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

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

9 个答案:

答案 0 :(得分:24)

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

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;

答案 1 :(得分:18)

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

通过实施compareTo方法(来自Comparable接口),您可以定义所谓的自然顺序。 JDK中的所有排序方法将默认使用此排序

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

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

在这种情况下会更简单。

现在,如果您同时使用名称和年龄作为比较标准,那么您必须决定您的比较,优先级。例如,如果两个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), ..}

您所要做的就是要求班级{{​​1}}使用其排序方法。

java.util.Arrays

Arrays.sort(jediAcademy); 方法将使用您的Arrays.sort方法逐个对对象进行排序。

答案 2 :(得分:2)

听@milkplusvellocet,我建议你也为你的班级实现Comparable接口。

只为其他人的答案做出贡献:

String.compareTo()将告诉您字符串与另一个字符串的不同之处。

e.g。 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())检查姓氏是否相同 this.lastName.compareTo(s.getLastName())如果是,则返回姓氏的比较。 this.firstName.compareTo(s.getFirstName())如果没有,则返回名字的比较。

答案 3 :(得分:1)

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

现在只需测试方法的正负回报,就像平常一样。

干杯

答案 4 :(得分:1)

你几乎都在那里。

比较姓氏的前几行是正确的。 string上的compareTo()方法将按字母顺序返回字符串的负数,然后按字母顺序返回1的正数。

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

换句话说,如果姓氏1 = =姓氏2,请继续检查您的名字。如果名字相同,请检查您的分数。 (考虑嵌套你的if / then块。)

答案 5 :(得分:1)

考虑使用Comparator描述here使用泛型的界面,以避免将Object投射到Student

正如Eugene Retunsky所说,你的第一部分是比较String的正确方法。此外,如果lastName s相等,我认为您打算比较firstName s,在这种情况下,只需以相同的方式使用compareTo

答案 6 :(得分:0)

String是Java中的一个对象。

你可以这样比较,

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

答案 7 :(得分:0)

如果我们知道它总是类型为Student,我就没有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;
}

答案 8 :(得分:0)

如果在任何类中使用Comparable接口的compare To方法。 这可用于按字典顺序排列字符串。

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