Java ComparableとComparatorの詳細な説明と違い
Javaは、比較メカニズムの2つの比較メカニズムを提供します。それらの違いは何ですか?今日は調べてみましょう。
同等の自然な種類
同等は、java.langパッケージの下にあるインターフェイスであり、内部を比較する方法は1つだけです。
public interface comparable <t> {public int compareto(t o);}同等のクラスを実装するクラスのオブジェクトを比較することができます。特定の比較ルールは、比較方法のルールに従って実行されます。この順序は自然順序と呼ばれます。
比較方法の返品値は次の3つのケースがあります。
知らせ:
1. Nullはクラスやオブジェクトではないため、比較方法を書き換える際には、e.comPareTo(null)の場合に注意を払う必要があります。 E.Equals(null)がfalseを返したとしても、比較方法はnullポインター例外nullpointerexceptionを積極的にスローする必要があります。
2。比較可能なクラスを実装して比較方法を書き直す場合、e1.comPareTo(E2)== 0の結果は、一般にE1.Equals(E2)と一致するために必要です。このように、将来、自然な種類のクラスに従ってソートされたsortedsetおよびその他のコレクションコンテナを使用する場合、保存されたデータの順序を想像力と一致させることができます。
上記の2番目のポイントに違反した場合、何が起こるかについて興味がある人もいますか?
たとえば、2つのオブジェクトAとbをソートセットに追加すると、abは満たされます(!a.equals(b)&& a.compareto(b)== 0)。他のコンパレーターが指定されていない場合、aとbを追加するとfalseを追加すると、ソートセットのサイズが増加しません。
実際、同等のインターフェイスを実装するすべてのJavaコアクラスの結果は、EqualASメソッドと一致しています。
比較可能なインターフェイスを実装するリストまたは配列は、collections.sort()またはarrays.sort()メソッドを使用してソートできます。
比較可能なインターフェイスを実装するオブジェクトのみを、sortedmap(sortedset)のキーとして直接使用できます。そうしないと、コンパレータのソートルールを外部で指定する必要があります。
したがって、自分自身を定義するクラスが順序付けられたコレクションクラスを使用する場合、次のような同等のインターフェイスを実装する必要があります。
** *説明:テストに使用されるエンティティクラスブック、比較可能なインターフェイス、自然なソート * <br/> *著者:shixinzhang * <br/> *データ:10/5/2016 */public class bookbeanは、シリアル化可能、比較可能{private文字列名;プライベートインクカウント; public bookbean(string name、int count){this.name = name; this.count = count; } public string getname(){return name; } public void setName(string name){this.name = name; } public int getCount(){return count; } public void setCount(int count){this.count = count; } / ** * equals * @param o * @return * / @override public boolean equals(object o){if(this == o)return true; if(!(o instanceof bookbean))falseを返します。 bookbean bean =(bookbean)o; if(getCount()!= bean.getCount())return false; return getname()。equals(bean.getname()); } /***重複を回避するために、すべての属性に基づいてハッシュコードの計算方法を書き直します*ハッシュコードの計算時に計算係数31が見られます。これは素数であり、再び分割することはできません * @return */ @override public int hashcode(){// stringのhashcode()を呼び出します。 // 31を掛け、さらにカウント結果= 31 * result + getCount();返品結果; } @Override public String toString(){return "bookbean {" + "name = '" + name +'/'' + "、count =" + count + '}'; } / ** * bookbeanをtreesetに追加すると、この方法は並べ替えるために呼び出されます。 int result; //たとえば、ここで帳簿価格で並べ替えるresult = getCount() - 別のbook.getCount(); // stringの順序に従う// result = getname()。比較(anotherbook.getName()); if(result == 0){//帳簿価格が同じ場合、タイトルを比較してください。すべての属性と比較されることを確認してくださいresult = getname()。比較(anotherbook.getName()); } return result; } // return 0 return 0; }上記のコードは、equalas()およびhashcode()メソッドも書き直しました。カスタムクラスは、これらの方法を比較したいときに書き直す必要があります。
後で比較を書き直す場合、特定の属性が同じかどうかを判断し、すべての属性を1回比較する必要があります。
同等のインターフェイスは、Javaコレクションフレームワークの一部です。
コンパレータカスタムソート
コンパレータは、java.utilパッケージの下のインターフェイスでもあります。 JDK 1.8の前には、2つの方法しかありませんでした。
パブリックインターフェイスコンパレータ<t> {public int compare(t lhs、t rhs); public boolean equals(オブジェクトオブジェクト);}JDK 1.8に多くの新しい方法が追加されました:
基本的に、それらはすべて機能に関連しており、1.8への新しい追加はここには紹介されません。
上記から、自然な並べ替えを使用するには、同等の並べ替えにクラスが必要であり、比較方法が内部的に書き換えられることがわかります。
Comparatorはルールを外部的にソートすることを設定し、Collections.sort()、arrays.sort()、または内部的に順序付けられたコレクション(sortedset、sortedmapなど)などのポリシーパラメーターのソートとして特定のクラスに渡します。
それを使用する方法は、主に3つのステップに分かれています。
1. Comparator Interfaceの実装クラスを作成し、オブジェクトに値を割り当てます
比較方法でカスタムクラスのソートルールを書きます
2。ソートクラスのメソッドにパラメーターとしてコンパレータオブジェクトを渡す
3.比較方法で使用されるカスタムクラスをソートクラスに追加する
例えば:
//1。ComparatorInterface Comparator = new Comparator(){@Override public int Compare(Object Object1、object Object2){newbookbean && object2 instance of newbookbean){newbookbean newbookbean =(newbookbbean)object1; NewBookBean NewBookBean1 =(NewBookBean)Object2; //特定の比較メソッドメソッドの自然並べ替えの比較を参照してください。ここに栗のnewbookbean.getCount() - newbookbean1.getCount(); } return 0; }}; // 2。このオブジェクトを正式なパラメーターとして、ツリーセットツリーセット=新しいツリーセット(コンパレータ)のコンストラクターに渡す。 // 3。ステップ1の比較方法で設計されたクラスのオブジェクトをツリーセットにツリーセットに追加します。 treeset.add(new NewBookBean( "S"、1)); treeset.add(new NewBookBean( "V"、46)); treeset.add(new NewBookBean( "Q"、26));実際、コンパレータの使用が戦略モデルであることがわかります。戦略モデルに精通していない学生は、ここをクリックして表示することができます。戦略モード:オンライン小説の固定ルーチンについて学ぶ。
コンパレータインターフェイスへの参照は、ソートクラスに保持されます。
コンパレータ<? Super K> Comparator;
さまざまなカスタムソートルールのコンパレーター実装クラスに合格し、同じクラスのさまざまなソート戦略を策定できます。
要約します
Javaの2つのソートメソッド:
同等の自然なソート。 (エンティティクラスの実装)
コンパレータはカスタムソートです。 (エンティティクラスを変更できない場合、発信者に直接作成されます)
同時に存在する場合、比較のためにコンパレータのルール(カスタムソート)を使用します。
一部の通常のデータ型(文字列、整数、ダブルなど)では、デフォルトで比較可能なインターフェイスを実装し、直接使用できるComparetoメソッドを実装します。
一部のカスタムクラスでは、さまざまな状況で異なる比較戦略を実装する必要がある場合があります。新しいコンパレータインターフェイスを作成し、特定のコンパレータの実装を使用して比較できます。
これは、ComparableとComparatorの違いです。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!