双重自然顺序无法按预期工作

时间:2017-12-02 15:47:59

标签: java unit-testing

我正在尝试使用泛型实现选择排序。为此,我收到一个比较器(因为我想在测试时使用方法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

1 个答案:

答案 0 :(得分:0)

在外循环的每次迭代中,

minIndex必须重置为-1。否则,您将先前找到的min元素与新元素交换。使用调试器可以很容易地发现这样的错误。