如何编写比较对象的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; } return 0; } 

我知道<>符号是错误的,但就像我说我的书只告诉你如何使用compareTo

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

 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; 

compareTo方法描述如下:

将此对象与指定的对象进行比较以获得顺序。 返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

假设我们想按照他们的年龄来比较Jedis:

 class Jedi implements Comparable { 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), ..} 

您所要做的就是要求java.util.Arrays类使用它的sort方法。

 Arrays.sort(jediAcademy); 

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

听@milkplusvellocet,我建议你也为你的class级实现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())检查lastnames是否相同this.lastName.compareTo(s.getLastName())如果是,则返回姓氏的比较。 this.firstName.compareTo(s.getFirstName())如果不是,则返回名字的比较。

你几乎一直都在那里。

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

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

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

考虑使用此处描述的使用generics的Comparator接口,以避免将ObjectStudent

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

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

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

干杯

String是Java中的对象。

你可以像这样比较,

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

我不会有一个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; } 

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

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