Comparable和Comparator如何在集合中工作?

时间:2015-03-29 17:03:34

标签: java arraylist collections

此代码来自着名的Java SCJP6书籍。我无法理解title方法中d.getTitle()compareTo之间的区别。 titled.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
}

2 个答案:

答案 0 :(得分:0)

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());
}

答案 1 :(得分:0)

您显示的compareTo()方法通过比较两个对象的标题来比较这两个对象。也就是说,它按照标题订购DVD。一张标题为&#34;纽约纽约&#34;无论DVDInfo对象中的所有其他字段如何,都会出现在标题为“Tiffany&#34;早餐”的DVD之后。

因此,compareTo()依赖compareTo()字段的title方法,String字段是String类型的对象。 Comparable实现compareTo(),因此有getTitle()方法按字典顺序排列字符串。

返回的结果是将当前对象的标题与给定对象的标题进行比较。在我看来,比较应该是双方的getTitle()(假设title将被覆盖并考虑到这一点)或双方的getTitle()(参加如果有人覆盖compareTo(),他们也应该覆盖compareTo())。但这可能是意见/风格问题。但最重要的是,这两个字符串都是字符串,这些字符串代表DVD的标题,并且这些字符串相互比较以产生从{{1返回的正值,零值或负值。 } 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);

&#34;当前&#34;对象(运行该方法的对象)是dvd1。它的title字段包含字符串&#34; Titanic&#34;。参数d是对dvd2引用的对象的引用。所以它的标题是&#34;银河守护者&#34;,以及方法d.getTitle()返回的内容。现在它比较这两个字符串,比较等同于:

"Titanic".compareTo("Guardians Of The Galaxy")

返回13(正数,显示&#34;泰坦尼克号&#34;大于&#34;银河守护者&#34;)。