compare()和compareTo()有什么区别?

121

Java中compare()compareTo()方法有什么区别?这两个方法是否给出相同的答案?


1
你指的是哪个比较类方法? - Markus Lausberg
请参阅以下链接,详细了解compare()和compareTo()的用法:http://sysdotoutdotprint.com/index.php/2017/03/28/comparable-vs-comparator/ - mel3kings
@mel3kings,您能否更新您的评论中的链接?它目前对这个问题没有提供任何信息。 - CJay Horton
16个回答

1

还有一个要点:

  • Comparable 用于为类中的对象定义默认排序
  • Comparator 用于定义自定义排序,以传递给方法。

comparator-vs-comparable


0

员工表
姓名,出生日期,薪水
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
}

}


0

还有一个应该强调的技术方面。比如说你需要一个客户端类的比较行为参数化,你想知道是否应该在这样的方法中使用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


0

使用Comparable接口按照多个值(如年龄、姓名、部门名称等)进行排序... 对于单个值,请使用Comparator接口


0

当您想要对包含对象Foo的列表进行排序时,Foo类必须实现Comparable接口,因为List的sort方法使用此方法。

当您想要编写一个比较两个其他类的Util类时,可以实现Comparator类。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接