为何Comparator.comparing()处理布尔值时默认返回逆序结果?
问题原因及解决办法
为什么false/非raid元素排在前面?
Java里的Boolean类型遵循自然升序规则:false < true——底层会把false映射为0,true映射为1。当你使用Comparator.comparing(Monster::isRaid)时,默认按升序排序,数值更小的false(对应0)自然会排在true(对应1)前面。
你第二次测试的代码:
Collections.sort(list, Comparator.comparing(s -> s.isRaid() ? 1 : 0));
逻辑和布尔排序完全一致:raid元素返回1,非raid返回0,升序排序时0(非raid)优先级更高,所以会排在1(raid)前面。
正确实现:让raid元素(返回true)排在最前面
有三种简洁的实现方式:
方式1:反转默认排序
直接对布尔比较器反转,将升序改为降序:
Collections.sort(list, Comparator.comparing(Monster::isRaid).reversed());
方式2:反转数值映射
把raid元素映射为更小的数值,让升序排序时它优先:
Collections.sort(list, Comparator.comparing(s -> s.isRaid() ? 0 : 1));
方式3:自定义比较逻辑
通过Boolean.compare交换比较对象,直接实现降序逻辑:
Collections.sort(list, (a, b) -> Boolean.compare(b.isRaid(), a.isRaid()));
验证结果
替换排序逻辑后,运行结果会将raid元素(isRaid=true)排在最前面,示例输出如下:
LEADER -> Name12 true Name12 true Name14 true Name0 false Name1 false ...(剩余非raid元素)
内容的提问来源于stack exchange,提问作者edith finch
相关产品推荐
相关产品推荐

