Java中如何结合API自带Comparator与自定义Comparator实现特殊排序
解决方案:自定义排序规则结合自然排序
嘿,这个需求很好实现,我们只需要把「优先放置"just"」的逻辑和API自带的Comparator.naturalOrder()结合起来就行,这里有两种靠谱的写法:
方法一:直观的Lambda逻辑写法
这种写法把排序逻辑拆解得很清楚,适合快速理解:
ArrayList<String> coll = new ArrayList<>(); coll.add("just"); coll.add("sdsd"); coll.add("asb"); coll.add("b as"); coll.add("just"); coll.add("dhfga"); coll.add("jusht"); coll.add("ktsa"); coll.add("just"); coll.add("just"); // 自定义排序逻辑 coll.sort((a, b) -> { boolean isAJust = "just".equals(a); boolean isBJust = "just".equals(b); // 优先处理"just"的排序优先级 if (isAJust && !isBJust) { return -1; // 当a是"just"而b不是时,a排前面 } if (!isAJust && isBJust) { return 1; // 当b是"just"而a不是时,b排前面 } // 两者状态相同(都是/都不是"just"),复用自然排序比较器 return Comparator.naturalOrder().compare(a, b); }); // 验证排序结果 coll.forEach(System.out::println);
逻辑说明:
- 先判断两个字符串是否为"just",优先处理优先级规则;
- 当两者都不是"just",或者都是"just"时,直接调用
Comparator.naturalOrder()的compare方法,复用API自带的字母排序逻辑。
方法二:简洁的链式比较器写法
如果喜欢Java 8+的函数式编程风格,可以用Comparator的链式API来实现,代码更紧凑:
ArrayList<String> coll = new ArrayList<>(); // 初始化集合代码同上... coll.sort(Comparator.comparing((String s) -> !"just".equals(s)) .thenComparing(Comparator.naturalOrder()));
逻辑说明:
Comparator.comparing((String s) -> !"just".equals(s)):这个比较器会把"just"转换为false,其他字符串转换为true;因为布尔值排序中false < true,所以所有"just"会自动排在最前面;.thenComparing(Comparator.naturalOrder()):当第一步的比较结果相等时(即两个字符串都不是"just",或者都是"just"),就使用自然排序规则继续比较。
两种方法都能完美实现你的需求,你可以根据自己的代码风格选择~
内容的提问来源于stack exchange,提问作者ShadowDragon
相关产品推荐
相关产品推荐

