使用Comparable接口的compareTo()方法

时间:2018-01-07 11:18:48

标签: java comparable

我有一个Employee类,要求是使用类似的接口对对象进行排序。使用此代码的输出是:

The difference of this id and other id is..** 6  other id**1
The difference of this id and other id is..** 3  other id**6
The difference of this id and other id is..** 3  other id**6
The difference of this id and other id is..** 3  other id**1
The difference of this id and other id is..** 11  other id**3
The difference of this id and other id is..** 11  other id**6
[Employee [name=lalit, id=1], Employee [name=zanjan, id=3], Employee [name=rmit, id=6], Employee [name=harjot, id=11]]
public class Employee implements Comparable<Employee> {
    private String name;
    private Integer id;

    @Override
    public String toString() {
        return "Employee [name=" + name + ", id=" + id + "]";
    }

    public Employee(Integer id, String name) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public Integer id() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setID(Integer id) {
        this.id = id;
    }

    @Override
    public int compareTo(Employee o) {
        System.out.println("The difference of this id and other id is..** " + id + "  other id**" + o.id);
        System.out.println(this.id);
        System.out.println(o.id);
        return this.id - o.id;
    }
}

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class ComparableDemo
{
    public static void main(String args[])
    {
        Employee e1 = new Employee(1, "lalit");
        Employee e2 = new Employee(6, "rmit");
        Employee e3 = new Employee(3, "zanjan");
        Employee e4 = new Employee(11, "harjot");
        List<Employee> empList = new ArrayList<Employee>();
        empList.add(e1);
        empList.add(e2);
        empList.add(e3);
        empList.add(e4);
        Collections.sort(empList);
        System.out.println(empList);
    }
}

我的问题是:

  1. 如何在6&amp;之间进行第一次比较。 1?
  2. 如何将号码6分配给this.id
  3. 比较3&amp; 6两次,都在第二和第三行输出?
  4. compareTo方法实际上如何运作?这个减法如何导致使用Comparable进行排序?
  5. this.id的值是什么?如何将这些值分配给this.id

1 个答案:

答案 0 :(得分:0)

  
      
  1. 如何在6&amp;之间进行第一次比较。 1?
  2.   

列表中首先检查的元素取决于Collection.sort(...)使用的排序算法。它是内部排序算法的实现细节。

  
      
  1. 如何将号码6分配给this.id
  2.   

您在构造函数中设置它。

  
      
  1. 比较3&amp; 6两次,都在第二和第三行输出?
  2.   

这并不是说算法想要将这些对象进行两次比较,但是在算法的某个点上它比较了它们,后来由于算法,它在算法的不同阶段再次比较它们。同样,这是内部排序算法的实现细节。

  
      
  1. compareTo方法实际上如何运作?这个减法如何导致使用Comparable进行排序?
  2.   

当来自Collection.sort(...)的排序算法正在运行时,在算法期间的某个时刻,它需要比较两个对象并计算这两个对象中的哪一个按顺序排在另一个之前(不必彼此相邻,只是“之前的某个地方”)。 compareTo()方法的返回值指定“this”对象相对于给定参数对象的定位方式。基于这些对象,compareTo()对象必须返回“小于零”,“等于零”或“大于零”的值。请参阅the documentation of the Comparable interface时应返回的值。

  
      
  1. this.id的值是什么?如何将这些值分配给this.id
  2.   

正如第二个问题的回答,该字段在您的构造函数中设置。