在ArrayList中使用的Comparable接口中使用==

sup*_*h v 1 java collections comparable

在Comparable Interface中使用==运算符

Employee.java

class Employee implements Comparable
{
    int id; String name; int age;

    Employee(int id,String name,int age)
    {
        this.id=id;
        this.name=name;
        this.age=age;
    }

    public int compareTo(Object obj)
    {
        Employee emp = (Employee)obj;
        if(age==emp.age)
        {
            return 0;
        }
        //else if(age>emp.age)
        //return 1;
        else
            return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

display_logic.java

import java.util.*;
class display_logic
{
  public static void main(String args[])
  {
     ArrayList al = new ArrayList();
     al.add(new Employee(1,"Supreeth",21));
     al.add(new Employee(2,"Vijay",31));
     al.add(new Employee(3,"Ganesh",21));
     al.add(new Employee(4,"Aisu",31));
     al.add(new Employee(5,"Aizzz",41));
     Collections.sort(al);
     Iterator it = al.iterator();
     while(it.hasNext())
     {
        Employee emp = (Employee)it.next();
        System.out.println("Employee name" +emp.name+ "," +emp.age);
     }
  }

}
Run Code Online (Sandbox Code Playgroud)

请让我怎么做==运算符工作

  • 我无法获得输出中正在实现的逻辑

产量

Employee name   Aizzz,41
Employee name    Aisu,31
Employee name    Ganesh,21
Employee name    Vijay,31
Employee name    Supreeth,21

先感谢您

aio*_*obe 6

合同compareTo说:

实现者必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有x和y.

所以,当这样使用时:

Employee emp = (Employee)obj;
if(age==emp.age)
    return 0;
else
    return -1;
Run Code Online (Sandbox Code Playgroud)

根本不起作用,因为你可能都有

emp1.compareTo(emp2) == -1      // "emp1 should come before emp2"
Run Code Online (Sandbox Code Playgroud)

emp2.compareTo(emp1) == -1      // "emp2 should come before emp1"
Run Code Online (Sandbox Code Playgroud)

这违反了合同.这意味着"所有赌注都已关闭",任何利用compareTo(例如Collections.sort)的方法都有未定义的行为.

可以使用,==但您必须更好地照顾!=案例:

Employee emp = (Employee)obj;
if(age==emp.age)
    return 0;
else if (age < emp.age)
    return -1;
else
    return 1;
Run Code Online (Sandbox Code Playgroud)

然而,更好的方法是做

return Integer.compare(age, emp.age);
Run Code Online (Sandbox Code Playgroud)