2

よし、正しい方向に向ける必要がある。私はすでにハッシュコードとオーバーライド付きのequalsメソッドを持っています。

@Override 
public int hashCode() {         
    return  type.hashCode() ^ type2.hashCode() ^ type3.hashCode()  ;        } 

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof MyObject)) {
        return false;
    }
    MyObject mdc = (MyObject) obj; 
    return mdc.type.equals(type) && mdc.type2.equals(type2) && mdc.type3.equals(type3); 
}

3 番目ではなく、1 番目と 2 番目のタイプのみを比較したい場合はどうすればよいでしょうか。後で使用するために、2 つの hash メソッドと equal メソッドを使用できますか?

私がやりたいことは、タイプ 1 とタイプ 2 が一致する場合、それらを現在の配列リストから削除し、それらを新しいリストに追加して、どれが同じタイプであったかを示すことです。これは、上記のハッシュ コードとは異なります。

配列内に別の方法はありますか? type1 と type2 のどの組み合わせが複数回出現するかを確認できますか?

元:

  • ハローを撃つ
  • CallofDutyを撃つ
  • レーシング フォルツァ
  • …………
  • .........
  • ..........
  • ハローを撃つ

シューティング ハローが 2 回表示されます。削除して別のリストに追加する必要がありますが、問題は、以前に使用したハッシュコードを既に持っていることです。

編集:アイデアをくれた皆さんに感謝します。同様のゲッターとセッターを備えた別のオブジェクトクラスを作成することでこの問題を解決しましたが、新しいハッシュコードを使用して機能しました。次回はより良いロジックメソッドを使用します。この投稿での私の主な目標は、1 つのクラスに複数のハッシュコードとメソッドを持つ方法があるかどうかを知ることでした。:)

4

5 に答える 5

7

同じクラスに同じ署名を持つ 2 つのメソッドを持つことはできないため、それは不可能です (これは Java クラス/メソッドの一般的な原則であり、メソッドだけではありませんequals) hashcode

コメントしたように、そのDennis Mengようなシナリオに遭遇した場合は、設計を再考する必要があります。

于 2012-08-09T20:59:26.233 に答える
2

3番目ではなく1番目と2番目のタイプのみを比較したい場合はどうなりますか?

あなたの要件は、オブジェクトを適切に比較できるさまざまなクラスを作成するように駆り立てられているように思えます。したがって、一方のクラスはtype1とtype2のみを比較する必要があることを認識し、もう一方のクラスは3つすべて(おそらくオブジェクトの階層)を比較する必要があることを認識しています。

于 2012-08-09T21:06:54.477 に答える
1

1つのクラスでは、方法はありません。クラスをサブクラス化して と をオーバーライドhashCode()equals(..)、ある場合にはあるクラスのインスタンスを使用し、別の場合には別のクラスのインスタンスを使用できます。しかし、このシナリオ全体は災害の可能性があるように見えるため、本当に必要かどうかを再検討してください。

複数の並べ替え順序を定義したいだけの場合は、外部Comparatorインスタンスを使用してください。

于 2012-08-09T21:00:58.103 に答える
0

あなたの本当の問題はイコール、ハッシュコードの問題ではないように思えます...コレクションに2番目のコレクションを入れようとしているものの1つがすでにある場合を処理しようとしており、これをequals、比較対象の 2 つのオブジェクト以上のものを認識しているハッシュコードです。私はここで「あなたの論理を再考する」列車に乗っていると思います.あなたが構築しようとしているコレクションは、あなたが現在苦労していると私が思うMap<String,List<MyObject>>以上のものだと思います.Set<MyObject>

MyObject インスタンスを押し込もうとしているデータ構造が だった場合Map<String,List<MyObject>>、equals() および hashcode() に関する String のデフォルトの処理が機能するため、MyObject equals/hashCode の質問は完全になくなります。

あなたの例では、これは次のようになります...

[ "Shooting Halo", [ MyObject("Shooting Halo"), MyObject("Shooting Halo") ],
[ "Shooting CallofDuty", [ MyObject("Shooting CallofDuty") ],
[ "Racing Forza", [ MyObject("Racing Forza") ]

コレクションが構築されたら、それを解析して、複数の値を持つキーをどうするかを判断できます。このパスに進む場合は、マルチマップの Google Guava ライブラリを参照してください。これにより、このユース ケースが簡単になります。 http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained

于 2012-08-09T21:24:50.763 に答える
0

類似の署名を持つ 2 つのメソッドを持つことはできません。言及しているロジックが何であれ、既存の equals メソッドに入れ、それに応じて結果を返すことができます

于 2012-08-09T21:00:30.943 に答える