正しいとequalsメソッドcompareToメソッドを書き換えます


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。
}

おすすめ

転載: www.cnblogs.com/suen061/p/11524959.html