【发布时间】:2017-12-16 06:15:09
【问题描述】:
我写了一个归并排序算法。当我运行以下测试时:
public static void main(String[] args){
Integer[] arr = {3,7,9,11,0,-5,2,5,8,8,1};
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(arr)); // asList() returns fixed size list, so can't pass to mergesort()
List<Integer> result = mergesort(list);
System.out.println(result);
}
我得到[-5, 0, 1, 2, 3, 5, 7, 8, 8, 9, 11],这是正确的。但是,我知道mergesort是一种稳定的排序,那我怎么写一个测试来证明这两个8的顺序是它们原来的顺序呢?
编辑:由于我使用了Integer 类,而不是原始整数,我想我可以得到hashCode(),因为Integer 扩展了基础Object 类。
但是,当我尝试时
Integer[] arr = {3,7,9,11,0,-5,2,5,8,8,1};
System.out.println(arr[8].hashCode());
System.out.println(arr[9].hashCode());
我只得到:
8
8
【问题讨论】:
-
你不能,用整数。您必须对具有整数属性和另一个唯一属性的对象进行排序。
-
@VasylLyashkevych 怎么可能重复?
-
它的劳动强度更大,但会创建 Integer EightA = new Integer(8) 等变量。然后您可以将它们在排序后与 == 进行比较,因为它比较引用,即 arr[8] == EightA , arr[9] == 八B 等
-
Integer的hashCode()是它自己的值,所以你不能用它来区分重复。你需要==,或者System.identityHashCode()。