arrays.sort(t []、Comparator <?super t> c)メソッドは、ユーザー定義のルールでオブジェクト配列をソートするために使用されます。
公式のJavaドキュメントは、この方法の役割を簡単に説明しているだけでなく、詳細に紹介していません。この記事では、この方法を詳細に分析します。
1。簡単な例
ソートメソッドの使用は非常にシンプルで明確です。次の例では、最初に犬のサイズを比較するコンパレータを定義し、そのインスタンスオブジェクトをソートメソッドにパラメーターとして渡します。この例を介して、array.sort()の使用をすばやくマスターできるはずです。
Import java.util.arrays; Import java.util.comparator; class dog {int size; public dog(int s){size = s;}} class dogsizecomparator emblestion comparator <@override public int compare(dog o1、dog o2){return o1.size -o2。 {犬D1 = new Dog(2);犬D2 =新しい犬(1);犬D3 = new Dog(3); dog [] dogarray = {d1、d2、d3}; printdogs(dogarray); arrays.sort(dogarray、new dogsizecomparator()); dogarray(dogarray); D:dogs)system.out.print(d.size + ""); system.out.println();}}}出力は次のとおりです。
2 1 3 1 2 3
2。ポリシーモードを使用します
これは、戦略パターンの完璧で簡潔な例です。戦略モデルがこのシナリオで使用するのに適している理由について言及する価値があります。
一般的に言えば、ポリシーパターンにより、プログラムが実行されたときに異なるアルゴリズムを選択できます。たとえば、ソートすると、異なるコンパレータが渡され、異なるアルゴリズムが使用されます。
上記の例によると、犬の重量で並べ替えたいとしたら、以下のように新しいコンパレータを作成できます。
class dog {int size; int weight; public dog(int s、int w){size = s; weight = w;}} class dogsizecomparatorは比較<dog> {@override public int compare(dog o1、dog o2){return o1.size -o2.size;}} class dogweightorator compartator <op op olide < {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); d3 = new Dog(3、40); dog [] dogarray = {d1 {d1、d2、d3}; printdogs( dogsizecomparator()); printdogs(dogarray); arrays.sort(dogarray、new dogweightcomparator()); printdogs(dogarray);} public static void printdogs(dog [] dogs){for(dog d:dogs)system.out.out( "size =" + d. -d.izezezize + " + d.weight +" + "); system.out.println();}}実行結果:
サイズ= 2重量= 5サイズ= 1重量= 3重量= 40サイズ= 1重量= 3重量= 2重量= 5サイズ= 3重量= 1重量= 3重量= 3重量= 40サイズ= 2重量= 50
コンパレータはインターフェイスであるため、ソートメソッドは、このインターフェイスを実装する任意のクラスに渡すことができます。これは、ポリシーパターンの主なアイデアです。
3.なぜ「スーパー」を使用するのか
「Comparator <T> C」を使用する場合は理解するのは簡単ですが、ソートの2番目のパラメーターの<?supert>は、コンパレータによって受け入れられているタイプがtまたはそのスーパークラスになる可能性があることを意味します。なぜそれはスーパークラスなのですか?答えは次のとおりです。これにより、同じコンパレータを使用してさまざまなサブクラスオブジェクトを比較できます。これは、次の例で明確に示されています。
Import java.util.arrays; Import Java.util.comparator; class Animal {int size;} class Dog extends Animal {public dog(size = s;}} class cat extends Animal {size = s;}} class animals comparator emprentic o2.size;} //このように、動物のすべてのサブクラスはこのコンパレータを使用できます。 d3}; printdogs(dogarray); arrays.sort(dogarray、new Animalsizecomparator()); printdogs(dogarray); system.out.println(); //猫の配列を持っている場合、同じ比較器を使用できます。 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 AmionalizeComparator()); PrintDogs(Catarray); system.out.print( "size =" + a.size + ""); system.out.println();}}}出力結果:
サイズ= 2サイズ= 1サイズ= 3サイズ= 1サイズ= 2サイズ= 3サイズ= 2サイズ= 1サイズ= 3サイズ= 1サイズ= 2サイズ= 3
4。概要
arrays.sort()に関連する情報は、次のように要約されています。
一般:スーパークラスの戦略デザインパターン。
並べ替え:時間の複雑さn*log(n);
java.util.collections#sort(list <t> list、comparator <?super t> c)は、同様のアイデアをarrays.sortに使用します。
要約します
上記は、Javaのarrays.sort()コードのすべての詳細な説明です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このウェブサイトで他のJava関連のトピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!