Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

HashMap

HashMapで

HashMap<myobj,HashMap<String,myobj2>> hm;

見たいな事をしたいのですが?
上記のようなことは可能でしょうか?
可能なら方法も知りたいです。


myobjは変数をもつ自作クラスで、オブジェクトがもつ
基本データ型3つの組み合わせでKeyとして区別します。


myobj2は独自クラスです。

質問を整理します。
質問1 HashMapのKeyに独自実装オブジェクトを使いた
い。
質問2 要素にHashMapを使いたいのです。

片方だけでも結構です。
よろしくお願いします。

8

回答

6734

閲覧

8件の回答

評価

0

つか、やってみたら。

評価

0

通常MapのキーにはStringが使われてるけど、これは単にそういう処理
が多いだけで、キーの型はObjectだから何でもいい。
例えばLongをキーにすれば、インスタンスが異なっても常に同じ値が
返る。

中身が同じインスタンスAとBを使って同じ値が得られるのは、AとB
が「等しい」と判定できるから。
文字列ではしょっちゅう自分で書いてるだろう。

自作クラスでも同じ書き方で「等しい」と判断できればいいわけだ。

評価

0

直接Keyにオブジェを代入してよいのでしょうか?

Keyとなるオブジェのほうで何かをimplementsしてから実装
したり、特定のメソッドを用意してから実装するなどは必要
ないのでしょうか?

評価

0

キーとなるクラスが何らかのインターフェースを実装しなければいけない、という決まりはないです。任意のクラスで OK です。

ただし、そのクラスの hashCode() と equals(Object) は適切にオーバーライドする必要があります。そうしないと期待と異なる同値判定になってしまうことがあります。

たとえば今回キーとなるクラス MyObj が、3つのメンバを持つとしましょう。

public class MyObj {

  public int key1;
  public String key2;
  public boolean key3;

  public MyObj(int key1, Strng key2, boolean key3) {
    //フィールド設定
  }

}

このとき、

MyObj o1 = new MyObj(1, "a", true);
MyObj o2 = new MyObj(1, "a", true);

この2つは異なるオブジェクトと見なされてしまいます。今回の場合、きっと、3つのメンバがすべて等しい場合は同じものとして扱いたいのですよね。

それを実現するためには、hashCode() が同じ値を返し、equals(Object) が true を返すように、適切に実装する必要があります。

評価

0

Stringをkeyに使えることは受け入れているんでしょ。
だったら、他のクラスだって同じようなものだと思うんだが。

回答を書いちゃうと、そういうことは、
equals()とhashCode()で済む。

ただし。
スレ主さんは、可変オブジェクトをkeyにするようなことは、
しない方がよかろう。

詳しいことは、APIドキュメントのMapの項に全部載ってる。

評価

0

お返事ありがとうございます。

>hashCode() が同じ値を返し、equals(Object) が true 
を返すように、適切に実装する必要があります。

つまり、Keyとなるクラスにequals()とhashCode()の二つ
のメソッドを書けばいいということですか?

これだけでHashMapは勝手にKeyとして認識してくれると
いうことでしょうか?

後、ドキュメントにも目を通しておきます。

評価

0

なんでこんなこと、いちいち鸚鵡返しせにゃならんのかね。

評価

0

> つまり、Keyとなるクラスにequals()とhashCode()の二つ
のメソッドを書けばいいということですか?

equalsとhashCodeはObjectクラスのメンバです。
念のため

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。