我正在学习数组,基本上我有一个收集姓氏,名字和分数的数组。
我需要编写一个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
。
这是比较字符串的正确方法:
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方法描述如下:
将此对象与指定的对象进行比较以获得顺序。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。
假设我们想比较杰迪斯的年龄:
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), ..}
您所要做的就是要求班级java.util.Arrays
使用其排序方法。
Arrays.sort(jediAcademy);
这个Arrays.sort
方法将使用你的compareTo
方法逐个排序对象。
听@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())
,则返回名字的比较。
你几乎一直都在那里。
比较姓氏的前几行是正确的。 string上的compareTo()方法将按字母顺序返回字符串的负数,之后按字母顺序返回1的正数。
现在,你只需要为你的名字和得分做同样的事情。
换句话说,如果姓氏1 ==姓氏2,请继续检查您的名字。如果名字相同,请检查您的分数。 (考虑嵌套你的if / then块。)
考虑使用描述使用泛型的Comparator
的here接口,这样你就可以避免将Object
转换为Student
。
正如Eugene Retunsky所说,你的第一部分是比较String
s的正确方法。此外,如果lastName
s相等,我认为你的意思是比较firstName
s,在这种情况下,只需以相同的方式使用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是没有意义的。
至于解释,“结果== 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<Student>{
public int compareTo(Object obj){
if(this==obj){
return 0;
}
if(obj!=null){
String objName = ((Student)obj).getName();
return this.name.comapreTo.(objName);
}
}