System.arraycopy抛出ArrayIndexOutOfBoundsException

时间:2015-07-01 15:30:21

标签: java mergesort

为什么System.arraycopy()抛出ArrayIndexOutOfBoundsException?我正在尝试编写mergeSort(它不是最终版本,首先我希望当前的算法可以使用这些数据)。

package Procedural.Intro;

import java.util.Arrays;
import java.util.Random;

/**
 * Created by Сергей on 28.06.2015.
 */
public class MergerSort {

    public static void main(String[] args) {

        int [] initial;
        int [] initial2;


        initial = new int [] {1, 4, 5, 6, 7};
        initial2 = new int [] {2, 4, 9, 11, 121};



        System.out.println("Array1 initial: " + Arrays.toString(initial));
        System.out.println("Array2 initial: " + Arrays.toString(initial2));


        System.out.println("Array result: " + Arrays.toString(MergerSort.mergerSort(initial, initial2)));



    }
       private static int [] mergerSort(int[] left, int[] right) {

            int [] result = new int[left.length + right.length];
            int leftIndex = 0;
           int rightIndex = 0;
          while( leftIndex + rightIndex < result.length) {

               if(left[leftIndex] > right[rightIndex]) {
                   result[leftIndex + rightIndex] = right[rightIndex++];
               }
               else {
                   result[leftIndex + rightIndex] = left[leftIndex++];
               }
               if(leftIndex == left.length) {

                 System.arraycopy(right, right[rightIndex],  result, leftIndex + rightIndex, result.length - (leftIndex + rightIndex));
                   break;
               }
               if(rightIndex == right.length) {
                   System.arraycopy(left, left[leftIndex],  result, leftIndex + rightIndex, result.length - ( leftIndex + rightIndex));
                   break;
               }
           }

         return result;
        }

}

2 个答案:

答案 0 :(得分:2)

如果您查看System.arrayCopy的文档,它希望第二个参数为索引到数组中。但是,您的阵列中有。所以很可能你想写

System.arraycopy(right, rightIndex, ...

而不是

System.arraycopy(right, right[rightIndex], ...

第二次致电System.arraycopy

时也一样

答案 1 :(得分:0)

您忘记了最后一个索引不是数组长度,它是数组长度 - 1.您忘记从System.arraycopy中的最后一个参数中减去一个 你应该有result.length - (leftIndex + rightIndex) result.length - (leftIndex + rightIndex) - 1