Java中thenComparing未按字典序排序?与文档描述不符的疑问
问题解答
你对文档里“字典序比较器”的理解出现了偏差:
返回一个带有可提取可比较排序键函数的字典序比较器。
这里的**“字典序”指的是多关键字的层级排序逻辑**——和字典里先按首字母排序、首字母相同再按第二个字母排序的逻辑一致:先使用主比较器(这里是Comparator.comparing(Container::getS))排序,当主比较器判定两个元素相等时,才会启用thenComparing提供的次比较规则。
它并不是指要把提取到的排序键(这里是Integer类型的x)当作字符串来按字典序排序。
你的代码逻辑分析
所有Container实例的s属性都是"a",主比较器判定所有元素相等,因此会完全按照thenComparing的规则排序:
- 你提取的排序键是
Integer类型的x,Integer的自然排序是数值升序,所以最终输出是a : 1、a : 4、a : 12,这是符合API逻辑的正确结果。
如何实现你预期的字符串字典序排序
如果想让x按照字符串的字典序排序(得到1、12、4的顺序),需要显式把x转换为字符串作为排序键:
list.sort(Comparator.comparing(Container::getS) .thenComparing(c -> c.getX().toString()) );
内容的提问来源于stack exchange,提问作者CocoaNut
相关产品推荐
相关产品推荐

