考虑到这种情况,我需要使用它们的名称(区域名称:字符串)对对象(区域)进行排序。我尝试使用Java Comparator接口。
class NameComparator implements Comparator<Zone> {
public int compare(Zone z1, Zone z2) {
return z1.getZoneName().compareTo(z2.getZoneName());
}
}
但是这个比较器只按字典顺序排序。
Ex:区域名称的必需订单。
['Zone AAa3','Zone aaa3','Zone BBB7','Zone BBb7','Zone bbb7']
当前输出:
['Zone AAa3','Zone BBB7','Zone BBb7','Zone aaa3','Zone bbb7']
除了编写原始对象排序方法之外,有没有办法实现这个目的?
答案 0 :(得分:10)
有一个pre-defined comparator for case-insensitive sorting.您可以将其与Zone
by extracting a sort key.
Comparator<Zone> byName = Comparator
.comparing(Zone::getZoneName, String.CASE_INSENSITIVE_ORDER)
.thenComparing(Zone::getZoneName);
答案 1 :(得分:1)
调整逻辑,将两个名称转换为小写或大写,然后进行比较。
public int compare(Zone z1, Zone z2){
if(z1.getZoneName().toLowerCase().equals(z2.getZoneName().toLowerCase()))
return z1.getZoneName().compareTo(z2.getZoneName());
else
return z1.getZoneName().toLowerCase().compareTo(z2.getZoneName().toLowerCase());
}
使用lambda -
Comparator<Zone> byName = (z1, z2)->{
if(z1.getZoneName().toLowerCase().equals(z2.getZoneName().toLowerCase()))
return z1.getZoneName().compareTo(z2.getZoneName());
else
return z1.getZoneName().toLowerCase().compareTo(z2.getZoneName().toLowerCase());
};