[英]How Comparable and Comparator work in Collections?
此代码来自著名的Java SCJP6书。 我无法理解compareTo
方法中title
和d.getTitle()
之间的区别。 title
和d.getTitle()
两者如何获取和比较值?
class DVDInfo implements Comparable<DVDInfo> {
String title;
String genre;
String leadActor;
DVDInfo(String t, String g, String a) {
title = t; genre = g; leadActor = a;
}
public String toString() {
return title + " " + genre + " " + leadActor + "\n";
}
public int compareTo(DVDInfo d) {
return title.compareTo(d.getTitle());
}
public String getTitle() {
return title;
}
// other getters and setters
}
在compareTo()
方法中,比较了两个实例。 当您从外面使用它时,它看起来可能像这样:
DVDInfo first = new DVDInfo("title1");
DVDInfo second = new DVDInfo("title2");
// compare
first.copareTo(second);
您可以看到在“第一个” DVDInfo实例范围中调用了compareTo()
方法。
在类中实现compareTo()
,您将获得“第二”实例作为参数:
public int compareTo(DVDInfo other) {
// 'title' is the local field (this.title)
// 'other.getTitle()' is the title from the 'other' (second) instance
return title.compareTo(other.getTitle());
}
您显示的compareTo()
方法通过比较两个对象的标题来比较它们。 也就是说,它按其标题订购DVD。 标题为“ Tiffany's Breakfast”的DVD之后将出现标题为“ New York New York”的DVD,而与DVDInfo对象中的所有其他字段无关。
因此, compareTo()
依赖于title
字段的compareTo()
方法,该方法是String
类型的对象。 String
实现Comparable
,因此具有一个compareTo()
方法,按字典顺序对字符串进行排序。
返回的结果是将当前对象的标题与给定对象的标题进行比较。 在我看来,比较应该是两边都是getTitle()
(假定getTitle()
将被覆盖并考虑到这一点),或者是两边都是title
(如果有人重写getTitle()
的方法getTitle()
他们还应该重写compareTo()
)。 但这也许是观点/风格的问题。 不过,最重要的是,这两个都是字符串,并且这些字符串代表DVD的标题,并且将这些字符串相互比较以产生要从compareTo()
返回的正,零或负值。 DVDInfo
。
取两个DVDInfo类型的对象:
DVDInfo dvd1 = new DVDInfo( "Titanic", "Drama", "Leonardo DiCaprio");
DVDInfo dvd2 = new DVDInfo( "Guardians Of The Galaxy", "Adventure", "Chris Pratt" );
现在,如果您运行
int result = dvd1.compareTo(dvd2);
“当前”对象(运行该方法的对象)是dvd1
。 其title
字段包含字符串“ Titanic”。 参数d
是对dvd2
引用的对象的引用。 所以它的标题是“银河护卫队”,这就是d.getTitle()
方法返回的内容。 现在,它比较这两个字符串,并且该比较等效于:
"Titanic".compareTo("Guardians Of The Galaxy")
返回13(正数,表示“泰坦尼克号”大于“银河守护者”)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.