Java再帰分類ソート:Sort()のComparatorを書き換えることにより、カスタマイズされた複雑なListやMapなどのカスタムソートルールを実現


本文:
プログラミング、特に最下位に偏ったり、ソートや比較に関連する機能を持っている場合、sortメソッドによく遭遇します.ソートや簡単なリストソートを満たすことができます.
しかし、リストのようなレビューのタイプに遭遇した場合、その中の1つのKeyを判断とソートとして取得するには、Sort()のComparatoを書き換えることを学ぶ必要があります(この方法はネストされたソートや階層、ツリーレベルのソートをすぐに解決することができます).例は以下の通りです.
//       
private static void ReWriteSort(List> obj) {
        if (obj == null) return;//  
        obj.sort(new Comparator>() {
            @Override //   ,      
            public int compare(Map o1, Map o2) {
                Long num1 = Long.parseLong(o1.get("  ").toString());
                Long num2 = Long.parseLong(o2.get("  ").toString());
                Long diff = num1 - num2;//             
                if (diff < 0) {
                    return -1;
                } else if (diff > 0) {
                    return 1;
                }
                return 0;
            }
        });
        for (Map item : obj) {
           ReWriteSort((List>) item.get("  "));
        }
    }

例は再帰的に書き換える方法であり、参照および議論のために異なるレベルを分類してソートすることができる.
背景学習:
一般的なSort()の方法は2つあり、1つはArraysである.もう一つはCollectionsですsort;
両者の特徴は、Collectionです.sortの下地にはArraysが使われています.sortの方法は、以下の通りです.
@SuppressWarnings("unchecked") 
public static > void sort(List list) { 
    list.sort(null); 
}

//  List sort  

@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator super E> c) { 
    Object[] a = this.toArray(); 
    Arrays.sort(a, (Comparator) c);
    ListIterator i = this.listIterator(); 
    for (Object e : a) { 
        i.next();
        i.set((E) e); 
    } 
}

Listを深く展開するsortは、最終的にArraysを呼び出したことを明らかにした.sortはソートし,最後に集合する.
jdk 7とjdk 8をよく耳にするArraysがありますsortには違いがあります.ソースコードを見てみましょう.
jdk7:
//jdk7
public static void sort(Object[] a) { 
    if (LegacyMergeSort.userRequested)
    legacyMergeSort(a); 
    else ComparableTimSort.sort(a); 
}

jdk8:
//jdk8
public static  void sort(T[] a, Comparator super T> c) { 
    if (c == null){ 
        sort(a); 
    } else { 
        if (LegacyMergeSort.userRequested)
             legacyMergeSort(a, c);
        else 
             TimSort.sort(a, 0, a.length, c, null, 0, 0); 
    } 
}

jdk 7が呼び出したのはComparableTimSortであることがわかる.sort(a);jdk 8はTimSortを呼び出す.sort(); クエリの知識によると、ComparableTimSortはカスタムコンパレータを使用しない.TimSort.sortは比較器に入力する必要がある.どちらも混合ソートを採用しており、単独で集計ソートを採用することはありません.
***https://www.toolsou.com/article/200539808】