首页 > 解决方案 > 在JAVA中没有操作就改变了数组的值

问题描述

请看代码,我在屏幕上打印的信息是:1:[2,1] 2:[1,1] 为什么会这样?这两个 System.out.println() 之间没有对 nums[1] 进行任何操作,但是 nums[1] 的值发生了变化。

public class SortingAlgorithm {

 public static void main(String[] args) {
    int[] nums= {2,1};
    int l=0, h=nums.length-1;
    int[] final_result=mergeSort(nums,l,h);
}

 public static int[] mergeSort(int[] nums,int l, int h) {

    if(l<h) {
        int m=(l+h)/2;              
        nums=merge(nums,l,h,m);
    }
    return nums;
}

 public static int[] merge(int[] nums,int l, int h, int m) {
    int[] result=nums;      
    int k=m+1, idx=0;   
    while(l<=m && k<=h) {
        if(nums[l]<nums[k]) {
        result[idx]=nums[l];                
        l++;    
        }

        else{                                    
                    System.out.println("1:"+Arrays.toString(nums));
        result[idx]=nums[k];     
                    System.out.println("2:"+Arrays.toString(nums));
        k++;
        }
        idx++;
    }
    while(l<=m) {
        result[idx]=nums[l];
        l++;
        idx++;
    }
    while(k<=h) {
        result[idx]=nums[k];
        k++;
        idx++;
    }
    return result;
}

}

标签: javaarrays

解决方案


这个

int[] result=nums;  

不复制数组“nums”;它只是意味着'result'和'nums'是同一个数组。

因此,对“结果”的操作是对“数字”的操作,这可能是您的问题的根源。

一种解决方法是

  int[] result = Arrays.copyOf(nums, nums.length);

(您需要“导入 java.util.Arrays”)

或者,手动复制它:

  int[] result = new int[nums.length];
  for (int k=0; k<nums.length; k++)
      result[k] = nums[k];

推荐阅读