在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()
排序。
有没有人知道这么容易做到的好方法?
由于
答案 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());
}
});
}