使用区分大小写的String键在Java中对对象进行排序

sha*_*iri 5 java sorting comparator

考虑到这种情况,我需要使用它们的名称(区域名称:字符串)对对象(区域)进行排序.我用Java Comparator接口尝试了这个.

class NameComparator implements Comparator<Zone> {
    public int compare(Zone z1, Zone z2) {
        return z1.getZoneName().compareTo(z2.getZoneName());
   }
}
Run Code Online (Sandbox Code Playgroud)

但是这个比较器只按字典顺序排序.

例如:区域名称所需的订单.

['Zone AAa3','Zone aaa3','Zone BBB7','Zone BBb7','Zone bbb7']

电流输出:

['Zone AAa3','Zone BBB7','Zone BBb7','Zone aaa3','Zone bbb7']

除了编写原始对象排序方法之外,有没有办法实现这个目的?

eri*_*son 10

有一个预定义的比较器,用于不区分大小写的排序.您可以通过提取排序键来使用它Zone .

Comparator<Zone> byName = Comparator
    .comparing(Zone::getZoneName, String.CASE_INSENSITIVE_ORDER)
    .thenComparing(Zone::getZoneName);
Run Code Online (Sandbox Code Playgroud)

  • @shamikaDharmasiri嗯,Java 7在一年前结束了支持(包括安全性),Java 9几乎就在这里.获得当前值得付出一些努力. (2认同)

Sub*_*der 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());
}
Run Code Online (Sandbox Code Playgroud)

使用 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());
};
Run Code Online (Sandbox Code Playgroud)