在java中合并两个排序数组 公共静态int[]合并(int-arr1[],int-arr2[]{ int x=arr1.length+arr2.length; int[]arr3=新的int[x]; x=0; int i=0,j=0; 而(i

在java中合并两个排序数组 公共静态int[]合并(int-arr1[],int-arr2[]{ int x=arr1.length+arr2.length; int[]arr3=新的int[x]; x=0; int i=0,j=0; 而(i,java,arrays,eclipse,sorting,merge,Java,Arrays,Eclipse,Sorting,Merge,短版: public static int[] merge(int arr1[], int arr2[]) { int x = arr1.length + arr2.length; int[] arr3= new int[x]; x=0; int i =0, j=0; while ( i<arr1.length||j<arr2.length) { if(arr1[i]<arr2[j]) {

短版:

public static int[] merge(int arr1[], int arr2[]) {
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while ( i<arr1.length||j<arr2.length)
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else 
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }
        
    }
    return arr3;
}
自己实施:

public static int[] merge(int arr1[], int arr2[]) {
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while ( i<arr1.length||j<arr2.length)
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else 
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }
        
    }
    return arr3;
}
也许您应该检查其中一个数组是否为空,如果某个数组比另一个数组长,还应该移动剩余的数组。此外,在检查是否到达数组末尾时,也许您应该使用&&而不是| |,以避免出现异常

System.arraycopy(arr, 0, arr3, 0, arr.length);
System.arraycopy(arr2, 0, arr3, arr.length, arr2.length);
return Arrays.sort(arr3);
公共静态int[]合并(int-arr1[],int-arr2[]{
//检查空数组
如果(arr1==null){
返回arr2;
}
如果(arr2==null){
返回arr1;
}
int x=arr1.length+arr2.length;
int[]arr3=新的int[x];
x=0;
int i=0,j=0;

而(i短版:

public static int[] merge(int arr1[], int arr2[]) {
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while ( i<arr1.length||j<arr2.length)
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else 
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }
        
    }
    return arr3;
}
自己实施:

public static int[] merge(int arr1[], int arr2[]) {
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while ( i<arr1.length||j<arr2.length)
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else 
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }
        
    }
    return arr3;
}
也许您应该检查其中一个数组是否为空,如果某个数组比另一个数组长,还应该移动剩余的数组。此外,在检查是否到达数组末尾时,也许您应该使用&&而不是| |,以避免出现异常

System.arraycopy(arr, 0, arr3, 0, arr.length);
System.arraycopy(arr2, 0, arr3, arr.length, arr2.length);
return Arrays.sort(arr3);
公共静态int[]合并(int-arr1[],int-arr2[]{
//检查空数组
如果(arr1==null){
返回arr2;
}
如果(arr2==null){
返回arr1;
}
int x=arr1.length+arr2.length;
int[]arr3=新的int[x];
x=0;
int i=0,j=0;

while(i让我们对程序进行一次试运行。假设arr1={2}和arr2={1,3}

声明和初始化部分是正确的

 public static int[] merge(int arr1[], int arr2[]) {
    // Checking for null arrays
    if (arr1 == null){
        return arr2;
    }
    if (arr2 == null){
        return arr1;
    }
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while (i<arr1.length && j<arr2.length) // This is where your exception occurs
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }

    }
    // Copying leftovers
    if (i < arr1.length){
        while(i < arr1.length){
            arr3[i + j] = arr1[i];
            i++;
        }
    }
    if (j < arr2.length){
        while (j < arr2.length){
            arr3[j + i] = arr2[j];
            j++;
        }
    }
    return arr3;
}
现在控制传递到循环

    //All correct here
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
现在,循环中的下一次i=0,j=1,x=1。记住这一点,if条件被检查。这一次它的2<3。返回true,然后执行下面的部分

    if(arr1[i] < arr2[j])    //2 < 1 returns false
    arr3[x]=arr2[j];
    j++;
    x++;
现在,这一次在循环中,i=1,j=1和x=2的值。这里是问题的开始。

    arr3[x]= arr1[i];
    i++;
    x++;

希望我能帮助你。

让我们对你的程序进行一次试运行。假设arr1={2}和arr2={1,3}

声明和初始化部分是正确的

 public static int[] merge(int arr1[], int arr2[]) {
    // Checking for null arrays
    if (arr1 == null){
        return arr2;
    }
    if (arr2 == null){
        return arr1;
    }
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while (i<arr1.length && j<arr2.length) // This is where your exception occurs
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }

    }
    // Copying leftovers
    if (i < arr1.length){
        while(i < arr1.length){
            arr3[i + j] = arr1[i];
            i++;
        }
    }
    if (j < arr2.length){
        while (j < arr2.length){
            arr3[j + i] = arr2[j];
            j++;
        }
    }
    return arr3;
}
现在控制传递到循环

    //All correct here
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
现在,循环中的下一次i=0,j=1,x=1。记住这一点,if条件被检查。这一次它的2<3。返回true,然后执行下面的部分

    if(arr1[i] < arr2[j])    //2 < 1 returns false
    arr3[x]=arr2[j];
    j++;
    x++;
现在,这一次在循环中,i=1,j=1和x=2的值。这里是问题的开始。

    arr3[x]= arr1[i];
    i++;
    x++;

希望我能帮到你。

请展示你的单元测试。大多数情况下的运行时错误:ArrayOutofBoundsException这些应该为你指出正确的方向。为什么你认为你得到了ArrayOutofBoundsException?请展示你的单元测试。大多数情况下的运行时错误:ArrayOutofBoundsException这些应该为你指出正确的方向ct方向为什么你们认为你们得到了边界感知的排列?