規約によれば、Java プログラミングを使用する場合は、可能な限り既存のクラス ライブラリを使用する必要があります。もちろん、ソート メソッドやフレームワークを自分で書くこともできますが、JDK よりも優れたものを書ける人がどれだけいるでしょうか。既存のクラスを使用するもう 1 つの利点は、コードが読みやすく保守しやすいことです。この記事では主に、既存のクラス ライブラリを使用して配列やさまざまなコレクション コンテナを並べ替える方法について説明します (記事内のいくつかの例は、「Java Developers Almanac 1.4」から引用しています)。 )
まず最初に、java.util.Arrays と java.util.Collections という 2 つのクラスについて知っておく必要があります (Collection との違いに注意してください) Collection はコレクション フレームワークの最上位インターフェイスであり、Collections には多くの静的メソッドが含まれています。配列を並べ替えるには配列を使用し、ArraysList、LinkedList などの結合されたフレーム コンテナーを並べ替えるにはコレクションを使用します。
java.util.* と、クラスや静的 main メソッドなどの他のシェル コードを例に追加する必要があります。最初の例ではすべてのコードを記述し、以下では例外なく省略します。
配列のソート
たとえば、次のような整数の配列があります。
次のようにコードをコピーします。
int[] intArray = 新しい int[] {4, 1, 3, -23};
どうやって並べ替えるのでしょうか?現時点ではクイックソートアルゴリズムについて考えていますか?これがどのように行われるかを見てみましょう。
次のようにコードをコピーします。
java.util.* をインポートします。
パブリック クラス ソート{
public static void main(String[] args){
int[] intArray = 新しい int[] {4, 1, 3, -23};
Arrays.sort(intArray);
}
}
このようにして、配列の静的メソッド 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 つの要素のみを並べ替えます。
もちろん、降順に並べ替えるにはどうすればよいのかと考える人もいるでしょう。多くの並べ替えメソッドのうち、コードの 1 つのコピーは次のとおりです。
sort(T[] a, Comparator<? super T> c)
Comparator を使用して、逆の順序でコンパレータを取得できます。 Comparator については、前の intArray[] を例として後で説明します。
次のようにコードをコピーします。
Arrays.sort(intArray,Comparator.reverseOrder());
このようにして、得られる結果は {4,3,1,-23} になります。元のコードを変更したくない場合は、以下を使用することもできます。
次のようにコードをコピーします。
Collections.reverse(Arrays.asList(intArray));
配列の逆順を取得します。結果も 4,3,1,-23} になります。
現在では状況が変わり、配列はプリミティブ データ型 (プリミティブ型) や String 型の配列ではなく、オブジェクトの配列になりました。この配列の自然な順序は不明であるため、このクラスの Comparable インターフェイスを実装する必要があります。たとえば、次のような Name クラスがあります。
次のようにコードをコピーします。
クラス名は Comparable<Name>{ を実装します
public String 名、姓;
public Name(String firstName,String lastName){
this.firstName=名;
this.lastName=姓;
}
public int CompareTo(Name o) { //インターフェースを実装する
int lastCmp=lastName.compareTo(o.lastName);
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
}
public String toString(){ //出力テストに便利
firstName+" "+lastName を返します。
}
}
このようにして、このオブジェクト配列を並べ替えるときは、compareTo(Name o) で実装されているのと同じように、最初に lastName を比較し、次に firstName を比較して、次に 2 つのオブジェクトの順序を取得します。次のプログラムで試してみることもできます。
次のようにコードをコピーします。
java.util.* をインポートします。
パブリック クラス NameSort {
public static void main(String[] args) {
名前 nameArray[] = {
新しい名前("ジョン"、"レノン")、
新しい名前(「カール」、「マルクス」)、
新しい名前(「グルーチョ」、「マルクス」)、
新しい名前(「オスカー」、「グルーチ」)
};
Arrays.sort(nameArray);
for(int i=0;i<nameArray.length;i++){
System.out.println(nameArray[i].toString());
}
}
}
結果は予想どおりです。
次のようにコードをコピーします。
オスカー・グラウチ
ジョン・レノン
グルーチョ・マルクス
カール・マルクス
コレクションフレームの並べ替え
配列を並べ替える Arrays.sort() を理解していれば、コレクション フレームワークの使用法も同様です。配列をコレクションに置き換えるだけです。コレクションはクラスであり、コレクションはインターフェイスであることに注意してください。違いは「s」が 1 つだけですが、その意味はまったく異なります。
このようなリンクされたリストがあるとします。
次のようにコードをコピーします。
LinkedList list=new LinkedList();
list.add(4);
list.add(34);
list.add(22);
list.add(2);
次のものを使用するだけです:
次のようにコードをコピーします。
コレクション.sort(リスト);
ll の要素を小さいものから大きいものに並べ替えると、結果は次のようになります。
次のようにコードをコピーします。
[2、4、22、34]
LinkedList 内の要素が文字列の場合も、基本データ型と同様に小さい値から大きい値へ並べ替えられます。
逆ソート、つまり、到達ソートから小規模ソートまでを実装する場合は、次のようにします。
次のようにコードをコピーします。
Collections.sort(list,Collectons.reverseOrder());
LinkedList 内の要素がカスタム オブジェクトである場合は、上記の Name オブジェクトのような Comparable インターフェイスを実装し、Collection.sort() で要素を並べ替えることができます。
独自のアイデアに従ってオブジェクトを並べ替える場合は、コピーしたコードを次のように使用できます。
sort(List<T> list, Comparator<? super T> c)
このメソッドは並べ替えを実行します。例を示す前に、まず Comparator の使用法と Comparable インターフェイスの形式について説明する必要があります。
次のようにコードをコピーします。
パブリック インターフェイス Comparator<T> {
int 比較(T o1, T o2);
}
実は、Comparatorのint Compare(T o1,T o2)の書き方は、ComparableのcompareTo()メソッドの書き方と似ています。上記の Name クラスでは、LastName から比較を開始します。これは中国では、元のコードを変更せずに fristName から比較を開始したいと考えています。
次のようにコードをコピーします。
最終的なコンパレータ<名前> FIRST_NAME_ORDER=新しいコンパレータ<名前>() {
public int Compare(名前 n1, 名前 n2) {
int firstCmp=n1.firstName.compareTo(n2.firstName);
return (firstCmp!=0?firstCmp:n1.lastName.compareTo
(n2.firstName));
}
};
このようにして、カスタマイズされたコンパレータ FIRST_NAME_ORDER が書き込まれます。
前の例の名前の配列をリストに変換します。
次のようにコードをコピーします。
List<名前> list=Arrays.asList(nameArray);
Collections.sort(リスト,FIRST_NAME_ORDER);
このようにして、独自に定義したコンパレータを使用して並べ替えを設定することができました。