Java中compare()
和compareTo()
方法有什么区别?这两个方法是否给出相同的答案?
Java中compare()
和compareTo()
方法有什么区别?这两个方法是否给出相同的答案?
员工表
姓名,出生日期,薪水
Tomas,1982年2月10日,300
Daniel,1990年3月11日,400
Kwame,1998年2月10日,520
Comparable 接口允许您根据一个主要字段对对象列表进行排序,例如,您可以使用 CompareTo() 方法按名称或按薪水进行排序。
emp1.getName().compareTo(emp2.getName())
对于这种需求,提供了更灵活的接口,即Comparator接口,其唯一方法是compare()
public interface Comparator<Employee> {
int compare(Employee obj1, Employee obj2);
}
示例代码
public class NameComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
// some conditions here
return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an
return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}
}
还有一个应该强调的技术方面。比如说你需要一个客户端类的比较行为参数化,你想知道是否应该在这样的方法中使用Comparable
还是Comparator
:
class Pokemon {
int healthPoints;
int attackDamage;
public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
System.out.println("battle won");
} else {
System.out.println("battle lost");
}
}
}
comparable
是一个 lambda 或一个对象,而且无法让 comparable
访问到 this
Pokemon 的字段(在 lambda 中,this
指代的是 lambda 作用域中外部类实例,在程序文本中定义)。因此,这样行不通,我们必须使用带有两个参数的 Comparator
。
使用Comparable接口按照多个值(如年龄、姓名、部门名称等)进行排序... 对于单个值,请使用Comparator接口
当您想要对包含对象Foo的列表进行排序时,Foo类必须实现Comparable接口,因为List的sort方法使用此方法。
当您想要编写一个比较两个其他类的Util类时,可以实现Comparator类。
Important Answar
String name;
int roll;
public int compare(Object obj1,Object obj2) { // For Comparator interface
return obj1.compareTo(obj1);
}
public int compareTo(Object obj1) { // For Comparable Interface
return obj1.compareTo(obj);
}
在这里,return obj1.compareTo(obj1)
或return obj1.compareTo(obj)
语句只能使用Object;原始类型是不允许的。
例如
name.compareTo(obj1.getName()) // Correct Statement.
但是
roll.compareTo(obj1.getRoll())
// Wrong Statement Compile Time Error Because roll
// is not an Object Type, it is primitive type.
name是String对象,所以它可以工作。 如果你想要对学生的卷号进行排序,那么请使用以下代码。
public int compareTo(Object obj1) { // For Comparable Interface
Student s = (Student) obj1;
return rollno - s.getRollno();
}
或者
public int compare(Object obj1,Object obj2) { // For Comparator interface
Student s1 = (Student) obj1;
Student s2 = (Student) obj2;
return s1.getRollno() - s2.getRollno();
}