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
相关产品推荐
相关产品推荐

