使用selection sort按长度升序排列字符串数组遇异常输出求助
选择排序字符串数组的问题排查与修复
问题根源
你的选择排序逻辑存在核心错误:只记录了最小长度的字符串内容,没有记录它在数组中的索引位置。
- 执行
min = a[j]时,只是让min变量指向了a[j]的字符串,但原数组中a[j]的位置没有任何变化。 - 最后交换
a[i]和min的操作,本质上只是把a[i]的值改成了min的内容(也就是最小的字符串),但原数组中原本存放这个最小字符串的位置并没有被替换。后续循环不断将min更新为最小字符串,最终导致所有元素都被覆盖成了最小的"me"。
修正后的代码
正确的选择排序需要通过索引追踪最小元素的位置,再通过索引完成数组元素的交换:
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] a = sc.nextLine().trim().split(" "); for (int i = 0; i < a.length - 1; i++) { // 记录当前最小元素的索引,初始为当前i的位置 int minIndex = i; for (int j = i + 1; j < a.length; j++) { // 比较j位置元素与当前最小元素的长度 if (a[j].length() < a[minIndex].length()) { minIndex = j; } } // 交换当前i位置和最小元素所在位置的内容 String temp = a[i]; a[i] = a[minIndex]; a[minIndex] = temp; } System.out.println(Arrays.toString(a)); } }
修正说明
- 用
minIndex记录最小长度字符串的索引,而非直接存储字符串内容 - 内层循环中,每次找到更短的字符串时,更新
minIndex为该元素的索引 - 外层循环最后,通过索引交换数组中两个位置的元素,真正完成排序所需的位置调换
测试输入Hello Java Its me,输出将是[me, Its, Java, Hello],符合预期的按字符串长度升序排列要求。
内容的提问来源于stack exchange,提问作者Darshit Sharma
相关产品推荐
相关产品推荐

