Java数组被修改

时间:2015-08-29 23:34:38

标签: java arrays

这是问题所在,让我来描述代码。

Sort.java
public class Sorting {
public int[] _input;
public  int[] _unsortedInput;
...
public int[] get_unsortedInput() {
     return _unsortedInput;
}
public void set_unsortedInput(int[] _unsortedInput) {
     this._unsortedInput = _unsortedInput;
}
public int[] get_input() {
     return _input;
}
public void set_input(int[] _input) {
     this._input = _input;
}

public void GenerateInput(){
    _input = new int[10];
    _unsortedInput = new int[10];
     for (int i = 0; i < tmp; i++) {
         Random rd = new Random();
         _input[i] = rd.nextInt(get_range());
         _unsortedInput[i] = _input[i];
    }
}
public void Sort() {    
}
SelectionSort.java
public class SelectionSort extends Sorting {
public SelectionSort(int[] number) {
     set_input(number);
}    
public void Sort() {    
    int[] number = get_input();
    // sorting logic which update number array only, not _unsortedInput 
    // array
}

Test.java

Sorting s = new Sorting();
s.GenerateInput();
SelectionSort ss = new SelectionSort(s.get_unsortedInput());
s.sort();

现在我的问题是,在排序之后,_input数组被排序。这是预料之中的。但_unsortedInput数组也被排序。虽然我没有对这个数组做任何事情。为什么?如何保护这个?

2 个答案:

答案 0 :(得分:2)

通过阅读您的代码,这两行选择未排序的数组,然后进行就地排序。

SelectionSort s = new SelectionSort(s.get_unsortedInput());
s.sort();

序列是这样的:

  1. Sorting.generateInput()生成两个不同的数组A1&amp; A2具有相同的值:_input表示A1,_unsortedInput表示A2。

  2. s.get_unsortedInput()获取_unsortedInput中的引用;即A2。

  3. SelectionSort构造函数执行此操作:

       public SelectionSort(int[] number) {
           set_input(number);
       }
    

    所以你的构造函数调用会这样做:

    1. 参数number将是对A2

    2. 的引用
    3. set_input来电将_input设置为A2。

      现在我们将_input和_unsortedInput都引用到A2。

  4. s.sort()调用会对_input引用的数组进行排序,该数组也是_unsortedInput引用的数组。

  5. 您(错误地)观察到您已排序&#34;两者&#34;阵列。现实情况是,_input_unsortedInput现在是同一个数组(A2)...因为set_input调用所做的事情。

  6.   

    为什么呢?

    见上文。

    实际上,还有另一个错误,因为你真的写了:

    SelectionSort ss = new SelectionSort(s.get_unsortedInput());
    s.sort();
    

    您正在sort而不是s致电ss。事情变得更加混乱。

      

    如何保护这个?

    嗯......这是你代码中的错误。你如何反对编写带有错误的代码?一般来说,没有解决方案......

    但是,如果您的Sorting类需要记录两个数组,并允许您选择要排序的数组,那么我将使用第三个变量; e.g。

       protected final int[] input;
       protected final int[] unsortedInput;
       protected int[] arrayToBeSorted;
    

    请注意final ...这样您就不会意外更改这些数组引用!

    使用setArrayToBeSorted替换两个setter,并更改sort方法以对arrayToBeSorted引用的内容进行排序。

    班级等级和适当的责任分工也存在问题。您的SelectionSort copnstructor的API基本上是错误的。它需要更改,以便您的测试代码可以执行此操作:

      SelectionSort ss = new SelectionSort();
      ss.generateInput();
      ss.setArrayToBeSorted(ss.getInput());
      ss.sort();
    

    或者更好的是,摆脱容易出错的选择机制。

    最后,请阅读Java Style Guide,尤其是讨论标识符约定的部分。

答案 1 :(得分:1)

这是因为您在set_input中致电SelectionSort. 在此构造函数中将set_input替换为set_unsortedInput