You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:25:09