I.概要
プログラムのデータ要素の束を並べ替え、検索、増加を削除します。
データノード
クラスノード{ int型。 int型のインデックス。 int型のスコア。 }
ルール:
1)オブジェクトはに等しい:n1.type == n2.type && n1.index == n2.index N1はN2に等しい場合、n1とn2つのノード
2)分類:昇順照合スコア、照合スコア同じタイプ比較インデックスと同じ型。
最初私はTreeMapのストレージを使用します。Comparableインタフェースを実装し、equalsメソッドのhashCodeメソッドをオーバーライドします。
次のように:
クラスノードは同等の<node> {実装 公共int型を、 公共int型のインデックス。 公共int型のスコア。 パブリック・ノード(INT T、U INT、INT S){ this.type = T。 this.index = U; this.score =秒; } @Override 公共int型のcompareTo(ノードO){ 場合(this.score!= o.score)リターンthis.score> o.score?-1:1; それ以外の場合(!this.type = o.type)戻りthis.type - o.type。 他this.index返す- o.indexを。 } @Override パブリックブール等しい(オブジェクトobj){ // TODO自動生成方法スタブ (この== OBJ)がtrueを返す場合。 もし(OBJノードのinstanceof){ ノードTN =(ノード)OBJ。 (tn.type == this.type && tn.index == this.index)の場合は、trueを返します。 } falseを返します。 } @Override 公共int型のハッシュコード(){ // TODO自動生成方法スタブ 戻りthis.type + this.index。 } }
プログラムが繰り返し検査の2時間後に、間違っています。私は、もしTreeMapの比較は、compareToメソッドを呼び出した場合と同じであることに気づきました。等しいと設定されているハッシュコードのHashMap。
修正後、データの各タイプは、のTreeMapによって記憶されます。
次のように:
クラスノードは同等の<node> {実装 公共int型を、 公共int型のインデックス。 公共int型のスコア。 パブリック・ノード(INT T、U INT、INT S){ this.type = T。 this.index = U; this.score =秒; } @Override 公共のintのcompareTo(ノードO){ IF(this.type == o.type && this.index == o.index)戻り0; 他に{ 場合(this.score!= o.score)リターンthis.score> o.score?-1:1; 他this.index返す- o.indexを。 } } }
プライオリティキューを使用して、最終的な並べ替え。
コンパレータ:
Comparetor <ノード> CMP =(X、Y) - > { IF(!x.score = y.score)戻りx.score> y.score?-1:1; それ以外の場合(!x.type = y.type)戻りx.type - y.type。 リターンx.index - y.index。 }
イコールとのcompareToを適切に使用するには、バグを減らします。
第二に、オーバーライドは等しいです
オブジェクトのその定義に保存されているHashSetのは、HashMapのキーとしてカスタムオブジェクトを使用して、等号を書き換える必要があります。書き換えるためのhashCode。同時に
ハッシュコードの位置を、比較は同じであると等しいです。
次のように:
@Override パブリックブール等しい(オブジェクトobj){//パラメータは、Object型のそれ以外の場合無効でなければならない // TODO自動生成されたスタブの方法であって、 真のIF(この== OBJ)のリターン; //同じ参照 (ノードのinstanceof OBJ)であれば{/ / OBJ条件が偽で、nullです。 TNは、ノード(Node)= OBJ; trueに(tn.type == == this.type && tn.index this.index)リターン; //コンテンツ比較対象 } ;偽に戻り }
同じハッシュコードオブジェクトを確実にするために同じ値を返します。私はより困難良いのhashCodeを達成したいです。
第三に、のcompareToを書き換えます
カスタムオブジェクトを保存する順序集合は、書き換えられたりcompareToメソッドコンパレータは、オブジェクトのために提供されています。コレクションに共通するのは、TreeMapの(赤黒木)、TreeSetの、優先度つきキュー(ヒープ)、配列::並べ替え(ソート配列)、コレクション::ソート(並べ替えリスト)を持っています。
次のように:
クラスデータは、同等の<データ> {実装 // 同等のインタフェースを実装する @Override のcompareTo(データO)が{0リターンに等しい未満の負の値を返す// int型公共、より正の大きな値を返し 手法スタブ生成// TODO自動の 戻り0; } }
コンパレータ、次のように:
コンパレータ<ノード> CMP =新しいコンパレータ<ノード>(){ @Override 公共intは(ノードO1、ノードO2)を比較{ // TODO自動生成方法スタブ 戻り0; } }。
ラムダ式を使用します。
Comparetor <ノード> CMP =(X、Y) - > { IF(!x.score = y.score)戻りx.score> y.score?-1:1; それ以外の場合(!x.type = y.type)戻りx.type - y.type。 リターンx.index - y.index。 }