3

我一直在寻找一种方法来仅根据其多个字段中的一个对对象列表进行排序(我最终只是自己问了这个问题),但在我的研究中,我遇到了这个答案:

https://stackoverflow.com/a/1421537/1549672

我对java很陌生,这可能就是原因,但我不太明白最后一种方法:

public static Comparator<Person> getComparator(final PersonComparator... multipleOptions) {
    return new Comparator<Person>() {
        public int compare(Person o1, Person o2) {
            for (PersonComparator option : multipleOptions) {
                int result = option.compare(o1, o2);
                if (result != 0) {
                    return result;
                }
            }
            return 0;
        }
    };
}

有人可以解释一下它是如何工作的……它到底是做什么的?谢谢!

4

5 回答 5

4

它将找到第一个不会返回“equals”的比较器并返回其值,否则它将返回“equals”。

实际上,它将通过创建一个基于 Comparator 接口的匿名类来创建一个新的 Comparator 来执行此操作。

public static Comparator<Person> getComparator(
   final PersonComparator... multipleOptions) 
{        
    return new Comparator<Person>() { //create anonymous class 
        public int compare(Person o1, Person o2) { //which implements the only method 
                                                   //in Comparator
            for (PersonComparator option : multipleOptions) { //loop through given 
                                                              //comparators
                int result = option.compare(o1, o2);
                if (result != 0) {                         //return value of the first
                    return result;                         //which says "non-equal"
                }
            }
            return 0;//all said "equals" so we say "equals"
        }
    };
}
于 2012-08-02T21:28:37.967 回答
1

getComparator方法将返回比较器,该比较器将Person根据在其参数中传递的比较器比较两个对象。每个PersonComparators 旨在通过 Person 类字段之一来比较 Person,例如

  • PersonComparator.ID_SORTid将通过(0 < 1 < 2 < 3 < ...)比较 Person 对象
  • PersonComparator.NAME_SORT将使用自然(字典)顺序(“a”<“aa”<“ab”<“b”)按名称比较 Person 对象。

如果您的 Person 类有更多字段,那么您可以向 enum 添加新的比较器PersonComparator

getComparator传递给方法 的 PersonComparators 的顺序也很重要。
例如,如果您有 Persons

Person p1 = new Person(1,"Jack");
Person p2 = new Person(2,"Jack");
Person p3 = new Person(2,"Adam");

你将创建比较器

getComparator(PersonComparator.ID_SORT,PersonComparator.NAME_SORT) 

它会先按他们id的 s 对人进行排序,如果 id 相同,那么它将按他们的名字对他们进行排序

(1,"Jack") (2,"Adam") (2,"Jack")

也是由创建的比较器

getComparator(PersonComparator.NAME_SORT, PersonComparator.ID_SORT) 

将首先比较名称,并且仅当名称相等时才会比较人员的 ID,因此您将以这种方式对人员进行排序

(2,"Adam") (1,"Jack") (2,"Jack")

于 2012-08-02T22:06:28.757 回答
1

您正在使用Comparator比较两个人对象。

比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数

于 2012-08-02T21:27:57.013 回答
0

基本上,此方法接收可变数量的 PersonComparator 对象,然后遍历它们以比较两个人员对象,返回第一个比较器,该比较器不返回两个给定人员对象之间的匹配项。

于 2012-08-02T21:31:46.593 回答
0

您将其他比较器的列表传递final PersonComparator... multipleOptions给 method getComparator

您的比较器在 for 循环中使用此 PersonComparators,如果由于当前 PersonComparator 而导致人员不相等,则返回结果。

因此,基本上,此方法返回 Comparator,如果 Persons 由于所有传递的比较器而相等,则返回 0,或者从传递的比较器compareTo方法返回第一个不匹配的 int。

于 2012-08-02T21:33:30.527 回答