使用Collections.sort在java中进行双重排序的最佳方法

时间:2014-07-09 01:36:10

标签: java android sorting

在java中我有一个自定义类,我按照这样排序:

public static void sortList(List<FishCategory> categories) {
    Collections.sort(categories, new Comparator<FishCategory>(){
        public int compare(FishCategory s1, FishCategory s2) {
            return s1.getName().compareTo(s2.getName());
        }
    });
}

但是像sql一样,你可以这样做:

select * from mytable
order by id, name

我想在java中进行双重排序。我希望按此排序(注意:我使用getParentId)作为第一种排序,然后我想按上面排序。

public static void sortList(List<FishCategory> categories) {
    Collections.sort(categories, new Comparator<FishCategory>(){
        public int compare(FishCategory s1, FishCategory s2) {
            return s1.getParentId().compareTo(s2.getParentId());
        }
    });
}

我不能在下一个取消第一次排序的原因之后立即运行这两个函数。我需要按照sql的方式进行排序(即对排序后的组进行排序)。

所以我想先按.getParentId()排序,然后.getName()排序。

有没有人知道这么容易做到的好方法?

由于

4 个答案:

答案 0 :(得分:5)

编写一个测试两个字段的比较器,只有在第一个相等时才查询第二个。将其插入排序中。完成。

请注意,如果您想要一个更通用的多级排序解决方案,您还可以编写包含两个比较器(或比较器列表)的比较器。

答案 1 :(得分:3)

Comparator的简单修改:

final int diff = s1.getParentId() - s2.getParentId();
return diff != 0 ? diff : s1.getName().compareTo(s2.getName());

如果getParentId()有差异,请按方式排序。另外按getName()排序。

  

正如by this comment by Pshemo所指出,您可以使用以下内容进行diff初始化:

= Integer.compare(s1.getParentId(), s2.getParentId());

答案 2 :(得分:3)

由于Java 8 Comparator具有thenComparing默认方法,您可以在其中添加下一个比较器,如果“原始”比较器确定值相等,则应使用该比较器。

所以你的代码看起来像

public static void sortList(List<FishCategory> categories) {
    Collections.sort(categories, new Comparator<FishCategory>(){
        public int compare(FishCategory s1, FishCategory s2) {
            return s1.getParentId().compareTo(s2.getParentId());
        }
    }.thenComparing(new Comparator<FishCategory>(){
        public int compare(FishCategory s1, FishCategory s2) {
            return s1.getName().compareTo(s2.getName());
        }
    }));

    Comparator.comparing(FishCategory::getParentId);
}

或者您可以使用接受Comparator.comparing字段的Function方法进行更简化,因此在您的情况下,您甚至可以使用lambdas并编写类似

的内容
Comparable

答案 3 :(得分:2)

首先使用parentId检查它,如果它相等,则比较名称

请参阅以下代码:

public static void sortList(List<FishCategory> categories) {
    Collections.sort(categories, new Comparator<FishCategory>(){
        public int compare(FishCategory s1, FishCategory s2) {
            int diff = s1.getParentId() - s2.getParentId();
            if (diff != 0)
                return diff;
            return s1.getName().compareTo(s2.getName());
        }
    });
}