我正在学习有关阵列,基本上我有收集姓氏,名字和分数的数组。
我需要写一个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方法描述如下:
相比之下,订单指定对象这个对象。 与此对象比指定的对象小于,等于或大于返回一个负整数,零或正整数。
比方说,我们希望通过他们的年龄比较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
方法的对象逐一排序。
听@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())
如果不是,则返回第一个名称的比较。
你在那里几乎所有的方式。
你的第几行,比较姓,是正确的轨道上。 上字符串的compareTo()方法将之前返回一个负数为按字母顺序排列的字符串,以及用于一个在后按字母顺序的正数。
现在,你只需要做同样的事,你的名字和分数。
换句话说,如果姓1 ==姓2,请在支票上下一您的名字。 如果第一个名字是一样的,选中你的分数。 (想想你的嵌套的if / then块)。
考虑使用Comparator
描述接口在这里它使用泛型这样就可以避免铸造Object
给Student
。
正如尤金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());
}
现在只是测试从方法的正负回报你会正常进行。
干杯
字符串在Java中的对象。
你可以比较像这样,
if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same
我不会有一个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;
}
如果您在使用比较中任何一类可比接口的方法。 这可以用来安排词典的字符串。
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);
}
}