ArrayList<String[]>排序异常求助:选择排序实现问题排查
选择排序逻辑错误排查与修复
核心错误:选择排序的比较对象错误
你的选择排序实现中,内层循环的比较逻辑存在根本性错误。选择排序的核心逻辑是在未排序区间内追踪最小元素的索引,但原代码每次将当前遍历元素与i位置的元素对比,而非与当前记录的最小元素(indexSmallest对应元素)对比,导致无法正确定位未排序区间的最小值,最终出现仅部分区间有序的问题。
原错误代码行:
if (data.get(j)[sortIndex].compareTo(data.get(i)[sortIndex]) < 0) {
修正后的选择排序代码
将比较对象改为indexSmallest对应的元素,即可实现正确的选择排序:
public static void selectionSort(ArrayList<String[]> data, int sortIndex){ int i; int j; String[] temp; int indexSmallest; for (i = 0; i < data.size()-1; i++) { indexSmallest = i; for (j= i + 1; j < data.size(); j++) { // 修正:与当前记录的最小元素比较,定位未排序区间的最小值 if (data.get(j)[sortIndex].compareTo(data.get(indexSmallest)[sortIndex]) < 0) { indexSmallest = j; } } temp = data.get(i); data.set(i, data.get(indexSmallest)); data.set(indexSmallest, temp); } }
额外注意点:字符串前缀空格问题
从你提供的示例行可以看到,国家名前带有空格(比如 Singapore),这会干扰字典序排序(空格的ASCII码小于字母,带空格的字符串会被优先排序)。若这并非预期效果,建议在读取数据时去除字符串首尾空格:
while (currLine != null) { String[] parts = currLine.split("\\,", -1); // 遍历每一列,去除首尾空格 for (int k = 0; k < parts.length; k++) { parts[k] = parts[k].trim(); } dataAL.add(parts); lineNum++; currLine = readBuffer.readLine(); }
内容的提问来源于stack exchange,提问作者Dylan Warcholik
相关产品推荐
相关产品推荐

