“ compareTo”比较用例

时间:2019-03-15 09:29:15

标签: java collections

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方法并决定按'year'排序时;比较如何进行?我可以理解,它根据比较结果返回1-10。但是在下面的代码行中如何进行比较:

 return this.year - m.year; 

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

8.8, "Force Awakens", 2015

并与列表中的所有元素进行比较,例如,将movie对象的元素传递给上面的compareTo方法?

对象比较如何进行?

3 个答案:

答案 0 :(得分:2)

Here's Collections.sort(..)方法的文档,内容如下:

  

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

这是完成排序的方式:

  

此实现将指定的列表转储到数组中,对   数组,并遍历列表,从中重置每个元素   数组中的对应位置。这避免了n2 log(n)   尝试对链表进行排序所产生的性能   地方。

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

答案 1 :(得分:0)

只是想像冒泡排序,将每个元素与其他元素进行比较,然后以错误的顺序交换它们的位置。这里使用 module(load="imuxsock") #rulesets rule(name="LinuxLogs") action(type="omfile" file="/var/log/RemoteDeviceLogs/linux/%FROMHOST-IP%.log") module(load="imudp") input(type="imudp" port="514" ruleset="LinuxLogs") 进行比较。

答案 2 :(得分:0)

Movie的{​​{1}}方法定义为,如果compareTo电影是在以后发行的,则this电影被认为比other电影更“伟大”比this电影大一年。 如果它们在同一年问世,则被认为是平等的。 如果other电影晚些时候发行,则视为“较小”。

示例

比较电影otherthis = (8.8, "Force Awakens", 2015)

other = (7.7, "Star Wars", 1977)

请注意,如果您倒转电影,则会得到与预期相反的结果。

原理

因此,“在幕后”程序可以推断出

(8.8,“强迫觉醒”,2015)>(3.2,“绝地归来”,1983)>(9.9,“帝国反击”,1980)>(7.7,“星球大战”, 1977)

通过对在各种电影对上调用return this.year - other.year return 2015 - 1977 return 38 // i.e. this > other 的结果进行采样来获取相当多的信息。 排序方法的确切实现细节(如所使用的算法)并不重要,这已从您那里抽象出来。重要的是,您可以通过定义自然顺序来使排序成为可能,即使程序能够始终如一地为任何一对compareTo对象确定两个对象中哪个是“更大”。