繁体   English   中英

可比和比较器在集合中如何工作?

[英]How Comparable and Comparator work in Collections?

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM