Kotlin的maxByOrNull返回非最大值问题及minByOrNull异常求助
Kotlin maxByOrNull/minByOrNull 字符串数字对比异常问题
测试场景与结果
测试代码1:
"6,9".split(",").maxByOrNull { it }?.toInt()返回结果:
9,符合预期。测试代码2:
"8,10".split(",").maxByOrNull { it }?.toInt()返回结果:
8,不符合预期(预期应为10)。
问题规律
仅当对比位数相同的字符串形式数字时,maxByOrNull结果正常;当数字位数不同时,结果出错。另外测试发现minByOrNull会返回最大值,存在同样逻辑问题。
问题原因
maxByOrNull此处传入的it是字符串类型,对比时采用字符串字典序而非数字大小:
- 字符串"8"和"10"对比时,字典序中"8"的首字符'8'的ASCII值大于"10"的首字符'1',因此被判定为更大。
- 位数相同的字符串数字(如"6"和"9"、"10"和"11"),字典序与数字大小一致,所以结果正常。
解决方案
需先将字符串转换为数字,再进行大小对比:
"8,10".split(",").maxByOrNull { it.toInt() }
或使用maxOfOrNull直接处理数字集合:
"8,10".split(",").map { it.toInt() }.maxOfOrNull()
内容的提问来源于stack exchange,提问作者Sunil Sunny
相关产品推荐
相关产品推荐

