Java 双自然顺序未按预期工作
我正在尝试使用泛型实现选择排序。为此,我收到了一个比较器(因为我想在测试时使用方法Java 双自然顺序未按预期工作,java,unit-testing,Java,Unit Testing,我正在尝试使用泛型实现选择排序。为此,我收到了一个比较器(因为我想在测试时使用方法comparator#naturalOrder()) 问题是,当使用Double数组调用它时,它不起作用,但当使用Integer数组调用它时,它起作用。 以下是我所做的选择排序实现: public static<V> void selectionSort(V[] arr, Comparator<V> cmp){ if (arr == null) throw new I
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 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
minIndex
必须在外部循环的每次迭代中重置为-1。否则,将以前找到的min元素与新元素交换。使用调试器可以很容易地发现此类错误
Arrays first differed at element [1];
Expected :2.5
Actual :8.0