29

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

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

4

9 回答 9

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;
于 2012-04-04T18:48:11.707 回答
18

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 中的所有排序方法都将使用此排序。

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

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.sort方法将使用您的compareTo方法对对象进行一一排序。

于 2012-04-04T18:56:35.493 回答
2

听听@milkplusvellocet,我建议您也为您的课程实现 Comparable 接口。

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

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

于 2012-04-04T19:04:34.693 回答
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());    
    }

现在只需像往常一样测试该方法的正负回报。

干杯

于 2012-04-04T18:50:09.740 回答
1

你几乎一直到那里。

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

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

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

于 2012-04-04T18:50:52.983 回答
1

考虑使用此处Comparator描述的使用泛型的接口,这样您就可以避免转换为.ObjectStudent

正如 Eugene Retunsky 所说,您的第一部分是比较Strings 的正确方法。此外,如果lastNames 相等,我认为您的意思是比较firstNames,在这种情况下,只需compareTo以相同的方式使用。

于 2012-04-04T18:54:04.387 回答
0

String 是 Java 中的对象。

你可以这样比较,

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same
于 2012-04-04T18:51:47.420 回答
0

我不会有 Object 类型参数,如果我们知道它始终是 Student 类型,那么将它转换为 Student 毫无意义。

作为解释,“result == 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;
}
于 2012-04-04T19:01:19.957 回答
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);
}
}
于 2018-08-29T17:02:56.510 回答