List <string>からカスタムクラスをソートするには、リストを並べ替える必要があることがよくあります。自分で並べ替える必要はありません。 1つのインターフェイスを実装するだけです。
この記事では、最初にコレクションの使用を紹介してリスト<string>を並べ替え、次にコレクションの原則について説明します。
カスタムクラスをソートする方法について話しましょう。
最後に、コレクションソートを使用してカスタムオブジェクトをソートする別の方法が導入され、 2つのソートは単純なパフォーマンスの比較です。
1。リスト<string>およびcollections.sortのソートの原則
コードは次のとおりです
List <String> StringList = new ArrayList <String>(); stringlist.add( "nice"); StringList.Add( "Delicious"); stringlist.add( "able"); stringlist.add( "moon"); stringlist.add( "try"); stringlist.add( "friend"); collections.sort(stringlist); for(string str:stringlist){system.out.println(str); }コレクションはjava.util.collectionsです。
コレクションのソート実装をご覧ください
@suppresswarnings( "unchecked")public static <tは比較可能<? Super t >> void sort(list <t> list){object [] array = list.toarray(); arrays.sort(array); int i = 0; listiterator <t> it = list.listiterator(); while(it.hasnext()){it.next(); it.set((t)array [i ++]); }}これから、ソート本体が配列であることがわかります。ソート(配列)。配列のソート実装はです
public static void sort(object [] array){// android changed canparabletimsort.sort(array);を開始します。 // Android-changedを終了}引き続き追跡します、Cantarabletimsortのソート実装CamparableTimSort.sort
静的void sort(object [] a)to static void sort(object [] a、int lo、int hi)private static void binarysort(object [] a、int lo、int hi、int start)。 BinarySortでは、サイズの比較に使用される部品はです
比較可能な<Object> pivot =(comparable)a [start]; int left = lo; int right = start;左<=右; while(左<右){int mid =(左 +右)>>> 1; if(pivot.compareto(a [mid])<0)right = mid;それ以外の場合は、左= MID + 1; }オブジェクトの比較は比較のために呼び出されます。デフォルトでは、文字列と整数の両方のタイプが比較方法によってオーバーライドされています。だからあなたはそれを自分で比較することができます
2。カスタムクラスの比較
上記の紹介を通して、コレクションのソートの原則を理解しています。以下は、カスタムオブジェクトのソートを紹介するためです。まず、整数と文字列の比較原則を確認し、カスタムクラスを比較する方法を紹介します。
2.1オブジェクトの実装を確認し、比較方法がないことを発見しました。
整数定義を見てください
パブリックファイナルクラスの整数は、数字を拡張します<integer>
文字列の定義を見てみましょう
パブリックファイナルクラスの文字列は、java.io.serializable、comparable <string>、charsequenceを実装します
それらはすべて同等のものから継承していることがわかります
2.2同等のインターフェイスを表示します
同等の方法には1つの方法しかないことがわかります
Javaコード
Public Int Compareto(T O);
言い換えれば、BinarySortメソッドは実際に比較可能な比較方法を呼び出します。
コレクションを呼び出すために比較を実装します。ソートカスタムオブジェクトをソートします
2.3カスタムクラスの比較
次のコードは、ユーザーをソートすることです。まず、名前で1つずつ並べ替えます。名前が同じ場合は、年齢ごとに小さいものから大きく並べ替えてください。
Javaコード
public class maintest {public static void main(string [] args){list <user> userlist = new ArrayList <user>(); userlist.add(new user( "Lucy"、19)); userlist.add(new user( "Jack"、19)); userlist.add(new user( "Jim"、19)); userlist.add(new user( "James"、19)); userlist.add(new user( "herry"、19)); userlist.add(new user( "luccy"、19)); userlist.add(new user( "James"、18)); userlist.add(new user( "herry"、20)); collections.sort(userlist); for(user user:userlist){system.out.println(user.getname() + "/t/t" + user.getage()); }} private static classユーザーは、比較可能な<user> {private string name;プライベートインクエイジ; public user(string name、int age){this.name = name; this.age = age; } @Override public int compareto(user aters){int comparename = this.name.compareto(another.getname()); if(compareName == 0){return(this.age == another.getage()?0:(this.age> another.getage()?1:-1)); } return comparename; } public string getname(){return name; } public int getage(){return age; }}}実行後、出力は次のとおりです。
XMLコード:
ヘリー19ヘリー20ジャック19ジェームズ18ジェームズ19ジム19ルーシー19ルーシー19
必要なのは2つだけであることがわかります
a。同等のものから継承されます
Javaコード
Private Static Classユーザーは、同等の<ユーザー>を実装します
b。比較方法を実装します
上記のpublic int compareto(ユーザー別)は比較の主題です
int comparename = this.name.compareto(another.getName());比較名を意味します
1より大きい、または返される場合、それはreturn 0に等しく、それが少ない場合、それは-1を返します。
等しい場合は、INT年齢のサイズに応じて比較します。
上記はreturn 1以上であり、上記はreturn -1未満であり、これもバイナリソートの比較の基礎です。
3.コレクションソートのオーバーロードされた関数を使用して、カスタムオブジェクトをソートします
コードは次のとおりであり、名前は最初に比較されます。等しい場合、年齢出力が比較されます
Javaコード
public class maintest {public static void main(string [] args){list <user> userlist = new ArrayList <user>(); userlist.add(new user( "Lucy"、19)); userlist.add(new user( "Jack"、19)); userlist.add(new user( "Jim"、19)); userlist.add(new user( "James"、19)); userlist.add(new user( "herry"、19)); userlist.add(new user( "luccy"、19)); userlist.add(new user( "James"、18)); userlist.add(new user( "herry"、20)); collections.sort(userlist、new Comparator <user>(){public int compare(user user1、user2){int comparename = user1.getName()。比較(user2.getName()); if(comparename == 0){return(user1.getage()== user2.getage()????〜getage()0:(user1.getage() } return comparename; for(user user:userlist){system.out.println(user.getname() + "/t/t" + user.getage()); }} private static classユーザー{private string name;プライベートインクエイジ; public user(string name、int age){this.name = name; this.age = age; } public string getname(){return name; } public int getage(){return age; }}}あなたはそれを見ることができます
Javaコード
collections.sort(userlist、new Comparator <user>())
それは比較の主題であり、コンパレータの比較方法を実装します。以下は、この方法の原則です
トラックコレクション
Javaコード
public static <t> voidソート(リスト<t>リスト、コンパレータ<?super t> c)
到着
Javaコード
public static <t> void sort(t [] a、comparator <?super t> c)
到着
Javaコード
private static void mergesort(object [] src、object dest、int low、int high、int off、Comparator C)
次のようにコードを見つけることができます。
Javaコード
if(length <insertionsort_threshold){for(int i = low; i <high; i ++)for(int j = i; j> low && c.compare(dest [j-1]、dest [j])> 0; j-)swap(dest、j、j-1);戻る; }Comparatorの比較方法を呼び出します
4。上記の2つのソートパフォーマンスの比較
BinarySortはNLG(n)比較を実行する必要があり、最悪の場合、n^2の動き
Mergesortは常にバイナリ分割を実行しており、バイナリ分割が小さな部分に分割された後、挿入されてソートされます。したがって、 NLG(n)時間が比較され、 NLG(n)時間が移動されます。ただし、最初にソースデータのコピーをコピーする必要があるため、スペースの2倍を占める必要があります
そのため、ニーズに応じて選択できます
上記の記事では、オブジェクト配列またはリストの順序付けについて簡単に説明し、コレクションのソート原則は私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。