为什么我的一个int数组的Int值大于10就变成0了?

Why does my Int value of an int array become 0 when it is higher than 10?

我编写的代码按升序对两个数组的值进行排序,它确实有效,但前提是我在数组中使用小于 10 的值。这实际上听起来像是一个简单的问题,但我已经尝试过任何方法,但我只是不明白为什么它不起作用。

首先我应该向您展示我写的合并功能:

public static int[] merge(int[] leftArray, int[] rightArray){
    int[] result = new int[leftArray.length + rightArray.length];
    int position = 0;
    int left = 0;
    int right = 0;

    String result_debug;
    while(true){
        /*
        System.out.println("Result: " + result[position]);
        System.out.println("Left: " + leftArray[left]);
        System.out.println("Right: " + rightArray[right]);
         */
        if(leftArray[left] < rightArray[right]){
            result[position] = leftArray[left];

            position = position + 1;
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            left++;
        } else if (leftArray[left] > rightArray[right]) {
            result[position] = rightArray[right];
            position = position + 1;
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            right++;

        } else if (leftArray[left] == rightArray[right]) {
            result[position] = leftArray[left];
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            position = position + 1;
            left++;
            result[position] = rightArray[right];
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            position = position + 1;
            right++;
        }

        if(left == leftArray.length && right < rightArray.length) {

            for(int i = position; i < rightArray.length; i++){
                result[i] = rightArray[right];
                System.out.println(rightArray[right]);
                right++;
            }
            break;
        } else if (right == rightArray.length && left < leftArray.length) {

            for(int i = position; i < leftArray.length; i++){
                result[i] = leftArray[left];
                System.out.println(leftArray[left]);
                left++;
            }
            break;
        } else if (left == leftArray.length && right == rightArray.length) {

            break;


        }

        //System.out.println("Result: " + result[position]);
        //System.out.println("Left: " + leftArray[left]);
        //System.out.println("Right: " + rightArray[right]);
    }


    System.out.println("Result: " + result[result.length - 1]);
    
    return result;
}

每当我使用值低于 10 的数组时,它都可以正常工作,但是当我使用任何更高的值时它就会变为 0。如您所见,我已经尝试了一些调试方法但没有成功。我还编写了一个函数,将一个 int 数组转换为一个 String 以将其打印出来我也可以向您展示该函数:

public static String arrayToString(int[]arr){
    String result = "[" + arr[0];

    for(int i = 1; i < arr.length; i++){
        result = result + ", " + arr[i];
    }
    result += "]";
    return result;
}

我也认为这可能是因为 arraytoString 方法,但正如您在我的合并方法底部看到的那样,我已经检查过并且输出仍然是 0,所以不是因为那个。

我不认为这是一个逻辑问题,因为正如我所说,只要我使用低于 10 的值它就可以工作,而且在我开始编程时,它甚至无法使用更高的值比 8 它后来开始与 9 和 10 一起工作。

我正在使用 Windows 10 Pro。

也许您不必使用自定义函数:

int[] one = new int[]{59, 1, 523, -43, 123, 5};
int[] two = new int[]{3, 901, 73, -4783, 1, 53};

//merging the arrays
int[] merged = new int[one.length + two.length];
System.arraycopy(one, 0, merged, 0, one.length);
System.arraycopy(two, 0, merged, one.length, two.length);

Arrays.sort(merged);

System.out.println(arrayToString(merged));

输出: [-4783, -43, 1, 1, 3, 5, 53, 59, 73, 123, 523, 901]

问题不在于数组值,而在于值在两个数组中的位置。问题将通过输入

体现出来
    int[] a = {1,2,3};
    int[] b = {4,5,6};
    int[] c = merge(a, b);

你应该学习如何使用调试器。然后你就可以正确调试你的代码了。问题是数组 b 中的第一项大于数组 a 中的所有项。所以你用 a 中的所有项目填充结果并推进 left(还有 position)直到 left 等于 leftArray.length.

在上面的例子中,此时,leftposition都等于3.

此时您输入以下 if 语句: if(left == leftArray.length && right < rightArray.length) {
您分配 i 以值 position 开头。使其等于 rightArray.length,因此您不会复制数组 b.

我不太确定解决它的确切原因是什么,但经过一些试验后,我的代码运行起来,因为它应该只需要将结果数组的最后一个值放在循环之外。工作代码是:

   public static int[] merge(int[] leftArray, int[] rightArray){
    int[] result = new int[leftArray.length + rightArray.length];
    int position = 0;
    int left = 0;
    int right = 0;

    String result_debug;
    while(true){
        /*
        System.out.println("Result: " + result[position]);
        System.out.println("Left: " + leftArray[left]);
        System.out.println("Right: " + rightArray[right]);
         */
        if(leftArray[left] < rightArray[right]){
            result[position] = leftArray[left];

            position = position + 1;
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            left++;
        } else if (leftArray[left] > rightArray[right]) {
            result[position] = rightArray[right];
            position = position + 1;
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            right++;

        } else if (leftArray[left] == rightArray[right]) {
            result[position] = leftArray[left];
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            position = position + 1;
            left++;
            result[position] = rightArray[right];
            result_debug = arrayToString(result);
            System.out.println(result_debug);
            position = position + 1;
            right++;
        }

        if(left == leftArray.length && right < rightArray.length) {

            for(int i = position; right < rightArray.length; i++){
                result[i] = rightArray[right];
                System.out.println(rightArray[right]);
                right++;
            }
            break;
        } else if (right == rightArray.length && left < leftArray.length) {

            for(int i = position; left < leftArray.length; i++){
                result[i] = leftArray[left];
                System.out.println(leftArray[left]);
                left++;
            }
            break;
        } else if (left == leftArray.length && right == rightArray.length) {

            break;


        }

        //System.out.println("Result: " + result[position]);
        //System.out.println("Left: " + leftArray[left]);
        //System.out.println("Right: " + rightArray[right]);
    }


    System.out.println("Result: " + result[result.length - 1]);
    if(leftArray[leftArray.length - 1] > rightArray[rightArray.length - 1]){
        result[result.length - 1] = leftArray[leftArray.length - 1];
    }
    if(rightArray[rightArray.length - 1] > leftArray[leftArray.length - 1]){
        result[result.length - 1] = rightArray[rightArray.length - 1];
    }
    return result;
}