萌新求问

T E 2019-04-13 09:04:45
public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(3); list.add(1); list.add(2); list.add(5); list.add(4); Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { System.out.println(o1); System.out.println(o2); System.out.println("-----------"); return o2 - o1; } }); System.out.println(list); } } (----------------------------------------------) 1 3 ----------- 2 1 ----------- 2 1 ----------- 2 3 ----------- 5 2 ----------- 5 3 ----------- 4 2 ----------- 4 3 ----------- 4 5 ----------- [5, 4, 3, 2, 1] 为什么2和1会比较两次,还有5和4不跟1比较
...全文
377 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗯嗯** 2019-04-18
  • 打赏
  • 举报
回复
说实话看源码我看的很懵逼 以下源码

public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)     //我看到这是永远是true,感觉是进这条分支
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

private static void mergeSort(Object[] src,
                                  Object[] dest,
                                  int low,
                                  int high,
                                  int off) {
        int length = high - low;

        // Insertion sort on smallest arrays
        if (length < INSERTIONSORT_THRESHOLD) {           //列表长度为5   5 < 7  故进这里
            for (int i=low; i<high; i++)
                for (int j=i; j>low &&
                         ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;
        }
但输出的过程大相径庭,完全跟我的想法不一样,虽然最后排序结果是降序是对的,但跟我预期的排序过程(冒泡排序)完全不一样 很奇怪,有没大神解释一波
哦呼 2019-04-18
  • 打赏
  • 举报
回复
而且这个排序是这样的 o1 - o2 正序 反过来就是逆序了
哦呼 2019-04-18
  • 打赏
  • 举报
回复
引用 2 楼 嗯嗯** 的回复:
说实话看源码我看的很懵逼
以下源码

public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested) //我看到这是永远是true,感觉是进这条分支
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}



private static void mergeSort(Object[] src,
Object[] dest,
int low,
int high,
int off) {
int length = high - low;

// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) { //列表长度为5 5 < 7 故进这里
for (int i=low; i<high; i++)
for (int j=i; j>low &&
((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
swap(dest, j, j-1);
return;
}



但输出的过程大相径庭,完全跟我的想法不一样,虽然最后排序结果是降序是对的,但跟我预期的排序过程(冒泡排序)完全不一样
很奇怪,有没大神解释一波


这个排序方法是按字符集排序 比较的
第一名zz 2019-04-18
  • 打赏
  • 举报
回复
首先你要知道他们的比较规则是什么,是怎么比较的
巴顿.com 2019-04-14
  • 打赏
  • 举报
回复
crtl进源码。。。。。。。。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧