不使用内置sort()排序字符数组结果不符,求排查代码错误
问题分析与修正
你的代码核心问题在于第三个条件的逻辑错误,导致数字内部的排序出现混乱。
错误原因
原代码的第三个条件:
(lst5[i] < lst5[j] && (Character.isDigit(lst5[i])))
这个条件没有限制j的类型——当i和j都是数字时,如果lst5[i] < lst5[j],该条件也会触发交换,直接抵消了第一个条件(数字升序)的作用。比如处理数字1和3时,1 < 3满足第三个条件,交换后反而把大的数字放到了前面,最终导致数字部分出现132的错误顺序。
你真正需要的第三个逻辑是:当i是数字,j是字母时,交换两者位置,确保所有字母排在数字前面。
修正后的代码
把第三个条件修改为仅在i是数字且j是字母时触发交换:
String input5 = "A2B3C1"; char[] lst5 = input5.toCharArray(); for (int i = 0; i < lst5.length; i++) { for (int j = i + 1; j < lst5.length; j++) { if ((Character.isDigit(lst5[i]) && Character.isDigit(lst5[j]) && lst5[i] > lst5[j]) || (!Character.isDigit(lst5[i]) && !Character.isDigit(lst5[j]) && lst5[i] > lst5[j]) || (Character.isDigit(lst5[i]) && !Character.isDigit(lst5[j]))) { // 修正此处 char tmp = lst5[i]; lst5[i] = lst5[j]; lst5[j] = tmp; } } } System.out.println(lst5); // 输出:ABC123
逻辑验证
修正后的三个条件分别对应:
- 都是数字:若前一个数字更大,交换(实现数字升序)
- 都是字母:若前一个字母更大,交换(实现字母升序)
- 前一个是数字、后一个是字母:直接交换(确保字母全部排在数字前)
这样就能得到预期的ABC123输出。
内容的提问来源于stack exchange,提问作者ipkiss
相关产品推荐
相关产品推荐

