首页 > 解决方案 > 'compareTo' 比较用例

问题描述

package Comparable;

public class Movie implements Comparable<Movie> {

    private double rating;
    private String name;
    private int year;

    @Override
    public int compareTo(Movie m) {
        // TODO Auto-generated method stub
        return this.year - m.year;
    }

    public Movie(double rating, String name, int year) {
        this.rating = rating;
        this.name = name;
        this.year = year;
    }    
}

主要课程:

package Comparable;

import java.util.ArrayList;
import java.util.Collections;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Movie> list = new ArrayList<Movie>();
        list.add(new Movie(8.8, "Force Awakens", 2015));
        list.add(new Movie(7.7, "Star Wars", 1977));
        list.add(new Movie(9.9, "Empire Strikes back", 1980));
        list.add(new Movie(3.2, "Return of the jedi", 1983));

        // Sort the items based on the pararmeter mentioned in the compareTo method
        // .Here the sort pareameter is the year of the release.
        Collections.sort(list);

        System.out.println("Movie after sorting :"+"\n");
        for (Movie movie : list) {
            System.out.println(movie.getName() + " " + movie.getRating() + " " + movie.getYear());
        }
    }

}

我有上面的用例compareTo。我想了解该compareTo方法在幕后做了什么。当我覆盖该compareTo方法并决定按“年份”排序时;比较是如何发生的?我可以理解它返回1-1并且0根据比较的结果。但是在下面的代码行中比较是如何发生的:

 return this.year - m.year; 

当我说this.year时,代码是否采用第一项,即

8.8, "Force Awakens", 2015

并比较列表的所有元素,即movie传递给compareTo上述方法的对象元素?

对象比较是如何发生的?

标签: javacollections

解决方案


这是方法的文档Collections.sort(..),这就是它所说的:

根据其元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素必须相互可比较(即,e1.compareTo(e2) 不得为列表中的任何元素 e1 和 e2 抛出 ClassCastException)。

这就是排序的完成方式:

这个实现将指定的列表转储到一个数组中,对数组进行排序,并遍历列表,从数组中的相应位置重置每个元素。这避免了由于尝试对链表进行排序而导致的 n2 log(n) 性能。

所以是的,所以你是对的。它从列表中提取每个元素,并使用 将其与其他元素进行比较compareTo


推荐阅读