按两个不同的属性对集合进行排序

Blu*_*eni 3 java sorting comparator

我有一个具有多个属性的类,希望将其排序。目前,我正在Name像这样排序:

Collections.sort(rowItems, new Comparator() {

    public int compare(Object o1, Object o2) {
        SearchRowItem p1 = (SearchRowItem) o1;
        SearchRowItem p2 = (SearchRowItem) o2;
        return p1.getName().compareToIgnoreCase(p2.getName());
    }

});
Run Code Online (Sandbox Code Playgroud)

但我也想排序LastName其次为Name(所以如果名称相同,排序LastName第二)。如何将下面的代码与第一类代码结合起来以得到我描述的结果?

Collections.sort(rowItems, new Comparator() {

    public int compare(Object o1, Object o2) {
        SearchRowItem p1 = (SearchRowItem) o1;
        SearchRowItem p2 = (SearchRowItem) o2;
        return p1.getLastName().compareToIgnoreCase(p2.getLastName());
    }

});
Run Code Online (Sandbox Code Playgroud)

was*_*ren 6

一个Comparator先比较name,然后比较的简单方法lastName将适用于该Collections.sort方法。

JavaDoc

比较其两个参数的顺序。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。


因此,以下是Comparator对两个属性进行比较的示例:

Collections.sort(rowItems, new Comparator<SearchRowItem>() {
    @Override
    public int compare(final SearchRowItem o1, final SearchRowItem o2) {
        int compare = o1.getName().compareToIgnoreCase(o2.getName());
        if (compare != 0) {
            return compare;
        }
        return o1.getLastName().compareToIgnoreCase(o2.getLastName());
    }
});
Run Code Online (Sandbox Code Playgroud)

但是,还有其他选择。Java 8引入了可以很好地集成排序的流。加上新的方法Comparator.comparingthenCompare一个漂亮的流可以这样被创建。

final List<SearchRowItem> collect = rowItems.stream()
        .sorted(
                Comparator.comparing(SearchRowItem::getName, String::compareToIgnoreCase)
                          .thenComparing(SearchRowItem::getLastName, String::compareToIgnoreCase))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

请注意,后者不会对原始List邮件进行排序,而是会创建一个新的排序列表。