这是问题所在,让我来描述代码。
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数组也被排序。虽然我没有对这个数组做任何事情。为什么?如何保护这个?
答案 0 :(得分:2)
通过阅读您的代码,这两行选择未排序的数组,然后进行就地排序。
SelectionSort s = new SelectionSort(s.get_unsortedInput());
s.sort();
序列是这样的:
Sorting.generateInput()
生成两个不同的数组A1&amp; A2具有相同的值:_input
表示A1,_unsortedInput
表示A2。
s.get_unsortedInput()
获取_unsortedInput
中的引用;即A2。
SelectionSort
构造函数执行此操作:
public SelectionSort(int[] number) {
set_input(number);
}
所以你的构造函数调用会这样做:
参数number
将是对A2
set_input
来电将_input
设置为A2。
现在我们将_input
和_unsortedInput都引用到A2。
s.sort()
调用会对_input
引用的数组进行排序,该数组也是_unsortedInput
引用的数组。
您(错误地)观察到您已排序&#34;两者&#34;阵列。现实情况是,_input
和_unsortedInput
现在是同一个数组(A2)...因为set_input
调用所做的事情。
为什么呢?
见上文。
实际上,还有另一个错误,因为你真的写了:
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
。