为何Arrays.sort()对int[]与数字型String[]排序结果不同?
为什么int数组和数字字符串数组用Arrays.sort()排序结果不同?
这是个非常棒的细节观察!核心原因其实是int类型和String类型的排序逻辑完全不一样,咱们来具体拆解:
1. int数组的排序逻辑
当你调用Arrays.sort(nums)(nums是int[]类型)时,排序是基于数值的自然大小进行的:
- 比较的是每个元素的数学值,比如
3 < 5 < 9 < 30 < 34,所以最终输出[3, 5, 9, 30, 34],这完全符合我们对数字排序的直觉。
2. 数字字符串数组的排序逻辑
而调用Arrays.sort(numstoString)(numstoString是String[]类型)时,排序是基于Unicode码点的字典序逐字符对比的:
- 第一步对比第一个字符:
"3"、"30"、"34"的首字符都是'3'(Unicode码为51),而"5"的首字符是'5'(53)、"9"是'9'(57),因为51 < 53 < 57,所以前三个字符串排在前面。 - 第二步对比前三个字符串的后续字符:
"3"没有第二个字符,"30"的第二个字符是'0'(48),"34"的第二个字符是'4'(52)。在字典序规则中,如果前面的字符完全匹配,短字符串会被认为更小,所以顺序是"3"<"30"<"34"。 - 最后
"5"和"9"按首字符对比,'5'<'9',所以最终输出[3, 30, 34, 5, 9]。
额外补充:让字符串数组按数值排序
如果想让数字字符串数组按照数值大小排序,可以自定义比较器:
Arrays.sort(numstoString, (a, b) -> Integer.compare(Integer.parseInt(a), Integer.parseInt(b)));
这样排序后的结果就会和int数组的排序结果一致了。
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

