オブジェクトのフィールドの値をキーとするハッシュマップ?

私は、キーがオブジェクト内の識別フィールドであるHashMapのようなクラスがあるかどうか疑問に思っていました。

存在しない場合、Map.Entryを実装する値として使用するクラスを持つことを考えていました。これは合理的なアプローチのように見えますか、それは危険なようですか? (私はキーフィールドを不変にします)

1
2番目の考えでは、Map.EntryにはパブリックメソッドsetValue()があるので、Map.Entryを実装した値を作成する私の考え方は実用的ではありません。 "this"を別の値に設定することはできないので、実際にはできません。
追加された 著者 Joe,
あなたのオブジェクトはどのように見えますか?
追加された 著者 Bhesh Gurung,
なぜこれのために特別な地図が必要でしょうか?クラス V を作成し、それにメンバフィールド K を与え、 Map を作成します。
追加された 著者 Nate W.,

4 答え

Map.Entryを実装する値として使用するクラスを持つことを考えていました。これは合理的なアプローチのように見えますか、それは危険なようですか?

危険であるか否かにかかわらず、単一責任の原則に違反するので、それは悪い設計です。クラスは、独自のものを行うこと、またMap.Entryであることに責任を持つべきではありません。別のライブラリで使用したい場合はどうなりますか?別のインターフェースを実装する必要がありますか?

Map.EntryAbstractMap を拡張しようとしていますか?)を実装して得たいと思っているものはわかりませんが、これは私にとって悪いことですそれが実際に行われたことは一度も見たことがない。

実際の問題は何ですか? HashMap を使用すると何が問題になりますか?

Map map = new HashMap();
MyClass myObj = new MyClass("myId");

//...
map.put(myObj.getIdentifier(), myObj);

MyClass retrievedObj = map.get("myId");
4
追加された
私はあなたの基本的なポイントが正しいと思います。私は物事をあまり冗長にしようとしていたのですが、その過程でおそらく私はほんの少し豪華だったでしょう。
追加された 著者 Joe,

ハッシュマップにオブジェクト(またはクラス)を追加するときは、マップに送信されるキーフィールドを選択します。クラスの中で目的のキーを返すgetKey()メソッドを作成するだけです。

オブジェクトをマップに挿入するときに使用します

たとえば、ID(String)をキーとするPerson Classがある場合です。この機能を作る:

public String getKey()
{
   return this.Id; //Or use the getter method
}

Personオブジェクトをマップに挿入するときに使用します。

Person1.getKey();
3
追加された
@ Shakedown良いことに感謝します。
追加された 著者 Alon Adler,
それは良いアプローチです。私はそれを使用すると思う。
追加された 著者 Joe,
私は彼らがやっていることの後にメソッドを命名するのが好きです。 Person オブジェクトの配列を作成する場合は、 Person オブジェクトに getIndex()メソッドを追加しますか? ?私はあなたのマップにキー以外の何かのコンテキストで使用するので、あなたのメソッド getKey()に名前をつけないことをお勧めします。あなたの getKey()がその人物のIDを返す場合、 getKey()の必要はなく、 getId()を使用します。
追加された 著者 Nate W.,

あなたはいつもHashMapを使用してキーとしてフィールドを追加することができます(もしもあなたがそれを不変にするなら、私はそれに何の問題も見ません)。

0
追加された

これは HashMap そのものです。オブジェクトの「識別フィールド」が equals()および hashCode()メソッドを正しく実装していることを確認してください。

例えばあなたのクラスが:

public class YourObject {
    private String identifyingField;

次に:

Map yourMap = new HashMap();
0
追加された