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
,-1
和0
。但是在下面的代码行中如何进行比较:
return this.year - m.year;
当我说this.year
时,代码是否采用了第一项,即
8.8, "Force Awakens", 2015
并与列表中的所有元素进行比较,例如,将movie
对象的元素传递给上面的compareTo
方法?
对象比较如何进行?
答案 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
电影晚些时候发行,则视为“较小”。
比较电影other
和this = (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
对象确定两个对象中哪个是“更大”。