java7是否存在排序问题?我正在使用Collections.sort(列表,比较器)
当我切换到java7时,我注意到与使用java6时的结果相比,排序产生了不同的列表。
示例:List = [d,e,b,a,c,f,g,h]
在java6 Collections.sort(List,comparator)中产生[a,b,c,d,e,f,g,h]
在java7 Collections.sort(List,comparator)中产生[b,a,c,d,e,f,g,h]
列表中的前两个值已被交换。
答案 0 :(得分:9)
Java 7从Merge sort切换到Tim sort。 “破坏的比较器”可能会导致顺序发生轻微变化(引用Arrays
class源代码中的注释):
/**
* Old merge sort implementation can be selected (for
* compatibility with broken comparators) using a system property.
* Cannot be a static boolean in the enclosing class due to
* circular dependencies. To be removed in a future release.
*/
尝试使用以下命令运行JVM:
java -Djava.util.Arrays.useLegacyMergeSort=true
目前尚不清楚“损坏的比较器”是什么意思,但显然它可能导致排序数组中元素的顺序不同。
答案 1 :(得分:0)
有一点需要注意,这可能会引起混淆。 Collections.sort是一个稳定的排序。这意味着对于相同的元素,它保持其原始顺序,因此:
如果a == b,那么
Collections.sort([d, e, b, a, c, f, g, h]) = [b, a, c, d, e, f, g, h]
和
Collections.sort([d, e, a, b, c, f, g, h]) = [a, b, c, d, e, f, g, h]
在我看来,无论是您所看到的,还是有问题的比较器(或者对象的自然排序)都没有达到预期的效果。