Java 合并排序索引错误

Java 合并排序索引错误,java,mergesort,Java,Mergesort,我有两个数组,一个字符串和一个int,我想按int数组对数组排序,而字符串数组必须与int数组相对应,所以如果我移动一个int,我需要移动一个字符串,反之亦然。按照我现在的方式,我得到了例外 public static void mergeSort(int[] arr,String[] str) { if (arr.length > 1 && str.length > 1) { int[] left = Arrays.copyOfRange(a

我有两个数组,一个字符串和一个int,我想按int数组对数组排序,而字符串数组必须与int数组相对应,所以如果我移动一个int,我需要移动一个字符串,反之亦然。按照我现在的方式,我得到了例外

public static void mergeSort(int[] arr,String[] str) {
    if (arr.length > 1 && str.length > 1) {
        int[] left = Arrays.copyOfRange(arr, 0, arr.length/2);
        int[] right = Arrays.copyOfRange(arr, left.length, arr.length);
        String[] Sl = Arrays.copyOfRange(str, 0, str.length/2);
        String[] Sr = Arrays.copyOfRange(str, Sl.length, str.length);

        mergeSort(right, Sr);
        mergeSort(left, Sl);
        merge(right, left, Sr, Sl,arr, str);
    }
}

public static void merge(int[] left, int[] right,
                         String[] Sleft, String[] Sright,
                         int[] orig, String[] sorig) {
    int i = 0;
    int j = 0;
    int f = 0;
    int tots = right.length + left.length;
    while (f < tots) {
        if (i < left.length && j < right.length) {
            if (left[i] < right[j]) {
                orig[f] = left[i];
                sorig[f] = Sleft[i];
                i++;
                f++;
            } else if(left[i] > right[j]) {
                orig[f] = right[j];
                sorig[f] = Sright[j];
                j++;
                f++;
            }
        } else if (i >= left.length) {
            orig[f] = left[i];
            sorig[f] = Sleft[i];
            f++;
            j++;
        } else if (j >= left.length) {
            orig[f] = right[j];
            sorig[f] = Sright[j];
            f++;
            i++;
        }
    }
}
publicstaticvoidmergesort(int[]arr,String[]str){
如果(arr.length>1&&str.length>1){
int[]left=Arrays.copyOfRange(arr,0,arr.length/2);
int[]right=Arrays.copyOfRange(arr,left.length,arr.length);
String[]Sl=Arrays.copyOfRange(str,0,str.length/2);
String[]Sr=Arrays.copyOfRange(str,Sl.length,str.length);
合并排序(右,Sr);
合并排序(左,Sl);
合并(右、左、Sr、Sl、arr、str);
}
}
公共静态无效合并(int[]左,int[]右,
String[]Sleft,String[]Sright,
int[]orig,String[]sorig){
int i=0;
int j=0;
int f=0;
int tots=right.length+left.length;
而(f右[j]){
orig[f]=右[j];
sorig[f]=Sright[j];
j++;
f++;
}
}else if(i>=左.长){
原[f]=左[i];
sorig[f]=Sleft[i];
f++;
j++;
}else如果(j>=左.长){
orig[f]=右[j];
sorig[f]=Sright[j];
f++;
i++;
}
}
}
问题在于:

} else if (i >= left.length) {
    orig[f] = left[i];

在这一点上,
i
将始终是不受限制的,因为您正在专门测试它是否只是前面的一行

如果有一些数组中包含示例值,甚至可能有一个完全工作的类,带有一个main函数,这会很有帮助,因此我们不必自己创建它们。尝试代码比仅仅看代码要好得多…更改copyOfRange(arr,left.length,arr.length);复制范围(arr,left.length-1,arr.length);字符串[]Sr=Arrays.copyOfRange(str,Sl.length,str.length);字符串[]Sr=Arrays.copyOfRange(str,Sl.length-1,str.length);