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)
一个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.comparing和thenCompare一个漂亮的流可以这样被创建。
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邮件进行排序,而是会创建一个新的排序列表。
| 归档时间: |
|
| 查看次数: |
2349 次 |
| 最近记录: |