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
相关产品推荐
相关产品推荐

