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

Java字符串数组与int数组同步归并排序异常排查

问题诊断与修复方案

你遇到的问题核心是merge方法里的条件分支语法错误,导致字符串和对应的int值没有正确绑定同步移动。我们来一步步拆解:

错误定位:缺失的大括号

看你merge方法里这段代码:

if(i<n1 && j<n2) {
    if(lWord[i].compareTo(rWord[j]) < 0) {
        word[k] = lWord[i];
        lineNumber[k] = lLineNum[i];
        i++;
    }else 
        word[k] = rWord[j];
        lineNumber[k] = rLineNum[j];
        j++;
}

这里的else后面没有用大括号{}包裹代码块,所以只有word[k] = rWord[j];属于else分支,而lineNumber[k] = rLineNum[j]; j++;会不管if条件是否成立都会执行!这就导致当lWord[i]小于rWord[j]时,你刚把lLineNum[i]赋值给lineNumber[k],紧接着又被rLineNum[j]覆盖,同时j也被错误递增,完全打乱了同步逻辑。

修复后的merge方法

只需要给else分支加上大括号,把相关操作包裹起来,就能保证字符串和对应的int值同步移动:

static void merge(String[] word, int[] lineNumber, int p, int q, int r) {
    int n1 = q-p+1;
    int n2 = r-q;
    String[] lWord = new String[n1];
    String[] rWord = new String[n2];
    int[] lLineNum = new int[n1];
    int[] rLineNum = new int[n2];
    int i, j, k;

    for(i=0; i<n1; i++) {
        lWord[i] = word[p+i];
        lLineNum[i] = lineNumber[p+i];
    }
    for(j=0; j<n2; j++) {
        rWord[j] = word[q+j+1];
        rLineNum[j] = lineNumber[q+j+1];
    }

    i = 0;
    j = 0;
    for(k=p; k<=r; k++) {
        if(i<n1 && j<n2) {
            if(lWord[i].compareTo(rWord[j]) < 0) {
                word[k] = lWord[i];
                lineNumber[k] = lLineNum[i];
                i++;
            } else { // 这里加上大括号
                word[k] = rWord[j];
                lineNumber[k] = rLineNum[j];
                j++;
            }
        } else if(i<n1) {
            word[k] = lWord[i];
            lineNumber[k] = lLineNum[i];
            i++;
        } else if(j<n2){
            word[k] = rWord[j];
            lineNumber[k] = rLineNum[j];
            j++;
        }
    }
}

测试验证

修复后运行你的main方法,输入的word = {"c", "b", "d", "a"}和lineNumber = {1, 2, 3, 4},输出会变成:

a b c d 
4 2 1 3 

这就实现了按字符串排序的同时,对应的int值同步跟随移动的需求。

额外建议

为了避免这类语法错误,建议养成所有分支代码块都用大括号包裹的习惯,哪怕只有一行代码。这样不仅能避免逻辑错误,也让代码可读性更强。另外,也可以考虑把字符串和对应的int值封装成一个类(比如class Item { String word; int lineNum; }),这样排序时直接操作对象数组,会更直观,也不容易出现同步错误。

内容的提问来源于stack exchange,提问作者Keri Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:02