Javaコレクションフレームワークと配列のソート

5275 ワード

約束によると、javaを使ってプログラミングするときはできるだけ既存のクラスライブラリを使うべきで、もちろん自分でソートの方法やフレームワークを書くこともできますが、JDKよりも上手に書ける人は何人いますか?既存のクラスを使用するもう一つの利点は、コードの読み取りとメンテナンスが容易であることです.この記事では、既存のクラスライブラリを使用して配列と各種Collectionコンテナをソートする方法について説明します(記事の一部の例は「Java Developers Almanac 1.4」から来ています).
まず、java.util.Arraysとjava.util.Collections(注意とCollectionsの違い)Collectionsは集合フレームワークの最上位インタフェースであり、Collectionsには多くの静的メソッドが含まれていることを知っておく必要があります.Arraysを用いて配列を並べ替え,Collectionsを用いてArrayList,LinkedListなどの結合フレームコンテナを並べ替えた.
例にはimport java.util.*や他のシェルコード、例えばクラスや静的mainメソッドを追加します.私は最初の例にすべてのコードを書きます.次に例外なく省略します. 配列のソート たとえば、整数配列があります.
    int[] intArray = new int[] {4, 1, 3, -23};私たちはどのようにソートしますか?この時、迅速にソートするアルゴリズムを考えていますか?次の実装方法を見てみましょう.
    import java.util.*;
    public class Sort{
        public static void main(String[] args){
            int[] intArray = new int[] {4, 1, 3, -23};
            Arrays.sort(intArray);
        }
    }

 
このようにArraysの静的方法sort()を用いてintArrayを昇順に並べ替えたが,現在配列は{-23,1,3,4}となっている. 文字配列の場合:  
String[] strArray = new String[] {"z", "a", "C"};
以下を使用します.
  Arrays.sort(strArray);ソートした結果{C,a,z},sort()は要素の自然な順序に従って昇順ソートされる.大文字と小文字に敏感でない場合は、次のように書くことができます.
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);もちろん、配列の下の表0-2の部分(配列の長さが3より大きいと仮定)を並べ替えるなど、配列のセグメントを指定することもできます.他の部分は変更されません.
Arrays.sort(strArray,0,2);これにより、前の3つの要素のみをソートし、後の部分に影響を与えません. もちろん、私はどのように降順をソートしますか?多くのsortメソッドの中で
sort(T[]a,Comparatorc)では、Comparatorを使用して逆シーケンスの比較器を取得できます.Comparatorは後で説明します.前のintArray[]を例に挙げます.
Arrays.sort(intArray,Comparator.reverseOrder());このようにして,我々が得た結果は{4,3,1,−23}であった.既存のコードを変更したくない場合は、次のように使用できます.
Collections.reverse(Arrays.asList(intArray));この配列の逆シーケンスが得られる.結果は同様に4,3,1,−23}であった.
現在の状況は変わり、私たちの配列には基本データ型(primtive type)やString型の配列ではなく、オブジェクト配列があります.この配列の自然な順序は不明なので、NameクラスなどのクラスにComparableインタフェースを実装する必要があります.
    class Name implements Comparable<Name>{
        public String firstName,lastName;
        public Name(String firstName,String lastName){
            this.firstName=firstName;
            this.lastName=lastName;
        }
        public int compareTo(Name o) {          //    
            int lastCmp=lastName.compareTo(o.lastName);
            return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
        }    
        public String toString(){                //      
            return firstName+" "+lastName;
        }
    }


 
このように、このオブジェクトの配列をソートすると、まずlastNameを比較し、firstNameを比較してから、compareTo(Name o)で実現されたように、2つのオブジェクトの前後順になります.プログラムで試してみてください.
    import java.util.*;
    public class NameSort {
        public static void main(String[] args) {
            Name nameArray[] = {
               new Name("John", "Lennon"),
               new Name("Karl", "Marx"),
               new Name("Groucho", "Marx"),
               new Name("Oscar", "Grouch")
           };[page]
           Arrays.sort(nameArray);
           for(int i=0;i<nameArray.length;i++){
               System.out.println(nameArray[i].toString());
           }
       }
   }


 
結果は私たちが望んでいるように:
    Oscar Grouch    John Lennon    Groucho Marx    Karl Marxコレクションフレームワークのソート Arrays.sort()が配列を並べ替えることを理解していれば,集合フレームワークの使用も大同小異である.ArraysをCollectionsに置き換えただけで、Collectionsはクラスであり、Collectionsはインタフェースであり、1つの「s」しか残っていないが、その意味は全く異なることに注意してください.
このようなチェーンテーブルがあれば、
    LinkedList list=new LinkedList();    list.add(4);    list.add(34);    list.add(22);    list.add(2);次の操作を行います.
Collections.sort(list);llの中の要素を小さい順に並べ替えることができて、結果は:[2,4,22,34]
LinkedListの要素がStringであれば、基本データ型のように小さいものから大きいものに並べ替えたいと思います.
逆順序のソートを実行する場合は、つまり小さいソートに到達します.
Collections.sort(list,Collectons.reverseOrder());LinkedListの要素がカスタムオブジェクトである場合、上のNameオブジェクトのようにComparableインタフェースを実装することで、Collection.sort()をソートできます. 自分の考え通りにオブジェクトを並べ替えたい場合は、
sort(Listlist,Comparatorc)というメソッドをソートし、例を示す前に、Comparatorの使用、Comparableインタフェースのフォーマットについて説明します.
    public interface Comparator<T> {
        int compare(T o1, T o2);
    }

 
実はComparatorのint comparare(T o 1,T o 2)の書き方とComparableのcomparareTo()の書き方の違いは多くありません.上のName類の中で私たちの比較はLastNameから始まります.これは西洋人の習慣です.中国に着いたら、fristNameから比較したいし、元のコードを修正したくないので、この時、Comparatorは役に立ちます.
    final Comparator<Name> FIRST_NAME_ORDER=new Comparator<Name>() {
        public int compare(Name n1, Name n2) {
             int firstCmp=n1.firstName.compareTo(n2.firstName);
             return (firstCmp!=0?firstCmp:n1.lastName.compareTo 
                     (n2.firstName));
        }
    };

 
このようなカスタマイズされたComparator FIRST_NAME_ORDERは書き終わりました.
前の例の名前配列をリストに変換します.
    List list=Arrays.asList(nameArray);    Collections.sort(list,FIRST_NAME_ORDER);
これにより,自己定義の比較器を用いてソートを設定することに成功した.