对对象中的多个属性进行排序

时间:2014-08-08 17:30:39

标签: java sorting

我有一个具有以下属性的对象:

MyObject {

int order;
Date date;

}

我有一个对象列表:

[
  {1, 2010},
  {9, 2011},
  {9, 2020},
  {2, 2001},
  {1, 2001}
]

我想首先按顺序(升序)和日期(降序)排序,因此预期输出:

[
  {1, 2010},
  {1, 2001}
  {2, 2001}
  {9, 2011},
  {9, 2020},
]

我找到了以下代码How do I sort a list by different parameters at different timed

enum PersonComparator implements Comparator<Person> {
    ID_SORT {
        public int compare(Person o1, Person o2) {
            return Integer.valueOf(o1.getId()).compareTo(o2.getId());
        }},
    NAME_SORT {
        public int compare(Person o1, Person o2) {
            return o1.getFullName().compareTo(o2.getFullName());
        }};

    public static Comparator<Person> decending(final Comparator<Person> other) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                return -1 * other.compare(o1, o2);
            }
        };
    }

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

我的困惑/疑问是:

            public int compare(Person o1, Person o2) {
                for (PersonComparator option : multipleOptions) {
                    int result = option.compare(o1, o2);
                    if (result != 0) {
                        return result;
                    }
                }
                return 0;
            }

它说是(result != 0) then return result

这意味着我打电话给Collections.sort(list, decending(getComparator(NAME_SORT, ID_SORT)));

和&#34; name&#34;比较返回非零,它将不适用于&#34; ID_SORT&#34;

它会如何运作?请解释上面的代码将如何适用于我上面的示例?

还是我完全忽略了这一点?

2 个答案:

答案 0 :(得分:1)

上面的代码看起来像是有一个排序标准的顺序。

  

“name”比较返回非零,它将不适用于“ID_SORT”

这是正确的行为;如果它为零,它们是相等的,所以继续下一个标准。否则使用这个。

但是,我可以建议另一种方法 - 使用库排序稳定的事实,因此如果您逐年应用排序,那么按顺序,您按顺序排序列表,如果顺序相同,然后按日期。

答案 1 :(得分:1)

  

它说if(result!= 0)然后返回结果,这意味着如果我调用Collections.sort(list,decending(getComparator(NAME_SORT,   ID_SORT)));并且“name”比较返回非零,它将不适用   与“ID_SORT”相比

当“ NAME_SORT ”比较器在此行返回非零时: - int result = option.compare(o1,o2);

然后,在getComparator方法中创建的自定义比较器将根据 NAME_SORT 比较方法中的比较逻辑重新排序(排序)o1和o2。

现在,如果 NAME_SORT 比较器发现比较中的两个对象相同,那么在没有撤回任何内容的情况下,getcomparator中创建的自定义比较器会检查下一个比较器的比较方法,直到它完成所有传递的比较器

对于您的情况,您需要比较ID,然后以相同的方式选择日期比较器。