ステップ--javaベース(11)--Arays.sortを深く理解する()

11528 ワード

この記事の転載は以下の通りですhttp://blog.csdn.net/renfufei/article/details/16359297
Arays.sort(T[],Compratorc)は、対象配列をユーザーのカスタムルールに従って並べ替える方法です.公式Java文書はこの方法の役割を簡単に説明するだけで、詳細な説明は行われません.ここでは、この方法を深く解析します.
1.簡単な例
sortメソッドの使用は非常に簡単で分かりやすいです.以下の例では、まずDogサイズのCompratorを定義して、その実例の対象をパラメータとしてsort方法に伝えます.この例を通じて、Arays.sort()の使用方法をすばやく把握することができるはずです.
import java.util.Arrays;  
import java.util.Comparator;  

class Dog{  
    int size;     
    public Dog(int s){  
        size = s;  
    }  
}  

class DogSizeComparator implements Comparator<Dog>{  

    @Override  
    public int compare(Dog o1, Dog o2) {  
        return o1.size - o2.size;  
    }  
}  

public class ArraySort {  

    public static void main(String[] args) {  
        Dog d1 = new Dog(2);  
        Dog d2 = new Dog(1);  
        Dog d3 = new Dog(3);  

        Dog[] dogArray = {d1, d2, d3};  
        printDogs(dogArray);  

        Arrays.sort(dogArray, new DogSizeComparator());   
        printDogs(dogArray);  
    }  

    public static void printDogs(Dog[] dogs){  
        for(Dog d: dogs)  
            System.out.print(d.size + " " );  

        System.out.println();  
    }  
}  
出力:
2 1 3  
1 2 3  
2.ポリシーモードを使う
これは戦略モードの完璧で簡潔な例であり、特にこのような場面でなぜ戦略モードが適切かというと、戦略モードはプログラム実行時に異なるアルゴリズムを選択することができます.例えば、順序付け時には異なる比較器(Comprator)が入ってきて、異なるアルゴリズムを採用します.上記の例によれば、Dugの重さに基づいて並べ替えをすると、次のように新しいコンパレータを作成して並べ替えられます.
class Dog{  
    int size;  
    int weight;  

    public Dog(int s, int w){  
        size = s;  
        weight = w;   
    }  
}  

class DogSizeComparator implements Comparator<Dog>{  

    @Override  
    public int compare(Dog o1, Dog o2) {  
        return o1.size - o2.size;  
    }  
}  

class DogWeightComparator implements Comparator<Dog>{  

    @Override  
    public int compare(Dog o1, Dog o2) {  
        return o1.weight - o2.weight;  
    }  
}  

public class ArraySort {  

    public static void main(String[] args) {  
        Dog d1 = new Dog(2, 50);  
        Dog d2 = new Dog(1, 30);  
        Dog d3 = new Dog(3, 40);  

        Dog[] dogArray = {d1, d2, d3};  
        printDogs(dogArray);  

        Arrays.sort(dogArray, new DogSizeComparator());   
        printDogs(dogArray);  

        Arrays.sort(dogArray, new DogWeightComparator());     
        printDogs(dogArray);  
    }  

    public static void printDogs(Dog[] dogs){  
        for(Dog d: dogs)  
            System.out.print("size="+d.size + " weight=" + d.weight + " ");  

        System.out.println();  
    }  
}  
実行結果:
size=2 weight=50 size=1 weight=30 size=3 weight=40  
size=1 weight=30 size=2 weight=50 size=3 weight=40  
size=1 weight=30 size=3 weight=40 size=2 weight=50  
Compratorはインターフェースですので、このインターフェースを実現した種類の例を任意の方法で導入することができます.これがポリシーモードの主要な考えです.
3.なぜ「スーパー」を使うのですか?
「Comprator<T>c」を使うと分かりやすいですが、sortの2番目のパラメータの中のコンパレータが受けるタイプはTまたはその超種類でありうるという意味です.なぜスーパークラスですか?これにより、同じコンパレータを使って異なるサブオブジェクトを比較することができます.以下の例では、この点を明らかに示しています.
import java.util.Arrays;  
import java.util.Comparator;  

class Animal{  
    int size;  
}  

class Dog extends Animal{  
    public Dog(int s){  
        size = s;  
    }  
}  

class Cat extends Animal{  
    public Cat(int s){  
        size  = s;  
    }  
}  

class AnimalSizeComparator implements Comparator<Animal>{  

    @Override  
    public int compare(Animal o1, Animal o2) {  
        return o1.size - o2.size;  
    }  
    //in this way, all sub classes of Animal can use this comparator. 
}  

public class ArraySort {  

    public static void main(String[] args) {  
        Dog d1 = new Dog(2);  
        Dog d2 = new Dog(1);  
        Dog d3 = new Dog(3);  

        Dog[] dogArray = {d1, d2, d3};  
        printDogs(dogArray);  

        Arrays.sort(dogArray, new AnimalSizeComparator());    
        printDogs(dogArray);  

        System.out.println();  

        //when you have an array of Cat, same Comparator can be used. 
        Cat c1 = new Cat(2);  
        Cat c2 = new Cat(1);  
        Cat c3 = new Cat(3);  

        Cat[] catArray = {c1, c2, c3};  
        printDogs(catArray);  

        Arrays.sort(catArray, new AnimalSizeComparator());    
        printDogs(catArray);  
    }  

    public static void printDogs(Animal[] animals){  
        for(Animal a: animals)  
            System.out.print("size="+a.size + " ");  

        System.out.println();  
    }  
}  
出力結果:
size=2 size=1 size=3  
size=1 size=2 size=3  
size=2 size=1 size=3  
size=1 size=2 size=3  
4.まとめ
Arays.sort()に関する情報をまとめました.
  • 汎用:super類
  • 策略設計モード;
  • 正規並べ替え(merge sort):時間複雑度n*log(n);
  • Java.util.Coollections(Listlist、Compratorc)とアラズ.sortは類似の思想を使用します.