使用枚举对列表进行排序

时间:2012-08-02 21:25:57

标签: java sorting

我正在寻找一种基于其多个字段之一对对象列表进行排序的方法(我最后只是自己提问)但在我的研究中,我遇到了这个答案:

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

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

5 个答案:

答案 0 :(得分:4)

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

实际上,它会创建一个新的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"
        }
    };
}

答案 1 :(得分:1)

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

  

比较其订单的两个参数。返回一个负整数,   零或正整数,因为第一个参数小于,等于   到,或大于第二个

答案 2 :(得分:1)

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

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

如果您的Person类有更多字段,那么您可以将新比较器添加到枚举PersonComparator

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

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对人进行排序,如果ids洁具相等,则会按名称对其进行排序

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

也是由

创建的比较器
getComparator(PersonComparator.NAME_SORT, PersonComparator.ID_SORT) 

将第一次比较名称,并且只有在名称相等的情况下它才会比较人员的ID,因此您将获得按此方式排序的人员

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您将其他比较符final PersonComparator... multipleOptions的列表传递给方法getComparator

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

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