You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java字符串列表排序问题:空串前置+逆序排序时Comparator调用报错

问题解决:Comparator.thenComparing方法编译错误及排序逻辑修正

错误原因

Comparator.reverseOrder()默认返回Comparator<Object>类型,而你传入的emptyValuesFirst()是Comparator<String>,两者泛型类型不匹配,导致编译器无法解析thenComparing(Comparator)方法。

解决方案1:指定泛型类型

明确给reverseOrder()指定泛型为String,让原比较器的类型变为Comparator<String>,即可兼容后续的thenComparing调用:

Assertions.assertThat(valuesInSortedColumn)
        .isSortedAccordingTo(Comparator.<String>reverseOrder().thenComparing(Comparators.emptyValuesFirst()));

额外修正:排序逻辑不符合需求

你的emptyValuesFirst()比较器存在逻辑错误:当两个字符串都非空时,返回0意味着它们被视为相等,不会进行逆序排序,这不符合你“非空字符串按逆序排序”的需求。需修正比较器逻辑:

public static Comparator<String> emptyValuesFirst() {
    return new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            boolean o1Empty = o1.isEmpty();
            boolean o2Empty = o2.isEmpty();
            
            if (o1Empty && o2Empty) {
                return 0;
            }
            // 空字符串排在前面,所以空串的优先级更高
            if (o1Empty) {
                return -1;
            }
            if (o2Empty) {
                return 1;
            }
            // 非空字符串按逆序比较
            return o2.compareTo(o1);
        }
    };
}

更简洁的写法(可选)

无需自定义比较器,直接用Java 8的Comparator组合API实现需求:

Comparator<String> comparator = 
    Comparator.comparing(String::isEmpty, Comparator.reverseOrder())
              .thenComparing(Comparator.reverseOrder());

Assertions.assertThat(valuesInSortedColumn)
        .isSortedAccordingTo(comparator);
  • Comparator.comparing(String::isEmpty, Comparator.reverseOrder()):将空字符串(isEmpty()返回true)排在非空字符串前面
  • .thenComparing(Comparator.reverseOrder()):非空字符串按自然逆序排序

内容的提问来源于stack exchange,提问作者kris82pl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:09:51