我正在尝试使用泛型实现选择排序。为此,我收到一个比较器(因为我想在测试时使用方法Comparator#naturalOrder()
。)
问题是,当使用Double
数组调用它时,它不起作用,但是当使用Integer
数组调用它时,它会起作用。
这是我做的选择排序实现:
public static<V> void selectionSort(V[] arr, Comparator<V> cmp){
if (arr == null)
throw new IllegalArgumentException("Invalid array, can't be sorted");
int minIndex = -1;
for(int i = 0, j; i<arr.length; i++){
for (j = i; j<arr.length;j++){
if (minIndex == -1 || cmp.compare(arr[minIndex],arr[j])>0){
minIndex = j;
}
}
swap(arr, i, minIndex);
}
}
private static<V> void swap(V[] arr, int i, int j) {
V aux = arr[i];
arr[i]=arr[j];
arr[j]=aux;
}
这是失败的测试:
@Test
public void selectionSortDoubleTest(){
arrDouble = new Double[]{5.5,2.5,1.2,8.0};
SelectionSort.selectionSort(arrDouble, Comparator.naturalOrder());
Assert.assertArrayEquals(new Double[]{1.2,2.5,5.5,8.0}, arrDouble);
}
这是有效的测试:
@Test
public void selectionSortIntegerTest(){
arr = new Integer[]{2,5,7,1};
SelectionSort.selectionSort(arr, Comparator.naturalOrder());
Assert.assertArrayEquals(new Integer[]{1, 2, 5, 7},arr);
}
奇怪的是,在第一次测试中,数组在位置[1]
上有所不同,因此两者都以1.2开头,但arrDouble[1]
为8.0,这没有任何意义。
我收到的断言错误消息:
Arrays first differed at element [1];
Expected :2.5
Actual :8.0
答案 0 :(得分:0)
minIndex
必须重置为-1。否则,您将先前找到的min元素与新元素交换。使用调试器可以很容易地发现这样的错误。