【问题标题】:Working of == in the Comparable interface used in ArrayListArrayList 中使用的 Comparable 接口中 == 的工作
【发布时间】:2015-02-25 07:04:49
【问题描述】:

可比接口中 == 运算符的工作

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;
    }
}

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

}

请告诉我 == 运算符是如何工作的

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

输出

员工姓名 Aizzz,41 员工姓名爱苏,31 员工姓名 Ganesh,21 员工姓名 Vijay,31 员工姓名 Supreeth,21

提前致谢

【问题讨论】:

  • 在排序时如果 compareTo()return 1 然后下一个元素将添加到前一个元素之后,如果它 返回 -1 元素将添加在前一个元素之前,如果为 0,则取决于之前或之后。 == 运算符只是比较原始类型的值并返回布尔结果
  • 你是说所有员工都比其他员工少,除了他们自己。即Aizzz

标签: java collections comparable


【解决方案1】:

compareTo的合约说:

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

所以,当这样使用它时:

Employee emp = (Employee)obj;
if(age==emp.age)
    return 0;
else
    return -1;

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

emp1.compareTo(emp2) == -1      // "emp1 should come before emp2"

emp2.compareTo(emp1) == -1      // "emp2 should come before emp1"

这违反了合同。这意味着“所有赌注都结束了”,任何利用compareTo 的方法(例如Collections.sort)都有未定义的行为。

可以使用==,但您必须更好地处理!= 的情况:

Employee emp = (Employee)obj;
if(age==emp.age)
    return 0;
else if (age < emp.age)
    return -1;
else
    return 1;

但是更好的方法是这样做

return Integer.compare(age, emp.age);

【讨论】:

  • 感谢 aioobe 的回复。但我正在寻找的是:如果我们看到输出输出以相反的顺序打印。如果你能说出这背后的逻辑那就太好了
  • 正如我所提到的,您的 compareTo 实现可能会告诉 Collections.sort a &lt; b b &lt; a,所以 Collections.sort 无法详细说明如何对元素进行排序,结果会得到这样奇怪的输出。
  • 也可以翻转比较,age > emp.age 时返回 1,age
猜你喜欢
  • 2013-04-22
  • 2020-09-08
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
相关资源
最近更新 更多