JAVA初心者です。

インスタンスを追加したArrayListから同インスタンスのフィールドを取り出す処理がうまく行かず、
調べても解決しなかったので、何か勘違いがあるのではないかと思いお尋ねします。

具体的にはArrayListで
class MyObject{
int fields;
...
}
のようなクラスから作ったmyobjectインスタンスを
ArrayList myobject_set = new ArrayList();
myobject_set.add(myobject);
のようにArrayListに追加しました。
ところが取りだそうとして、

MyObject getobject = new MyObject();
getobject = myobject_set.get(0);
とすると、「型の不一致: Object から MyObject には変換できません」と出ます。
System.out.println(myobject_set.get(0));
とすると、
***.***.MyObject@ca0b6
のような値が返ってきます。

myobject_set.get(0).fields
のように値を取り出せると思っていましたし、MyObjectをObjectに変換するとか、参照を評価するとか、
何かワンステップが抜けているだけと思って調べても解決しなかったので、何か勘違いがありそうです。

fieldsの取り出し方について、どなたか教えてくださいませんか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/03/16 18:36:51
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:blueberrystream No.4

回答回数34ベストアンサー獲得回数5

ポイント50pt

目的は上記のようなデータ構造を持つ、多次元の連想配列を実現することですが、一般的にはどうするのでしょうか?

こちらについてですが、key1, key2, …が各mainkeyで共通なのであれば、データクラスを作成して、

そのクラスをHashMapクラスで管理したり、そのクラスを束ねて管理するためのクラスを作ったりするのが一般的かと思います。

例として社員管理のことを考えると、mainkeyを社員番号、key1を氏名、key2を生年月日…とすると

>|java|

class 社員 {

private String 社員番号;

private String 氏名;

private String 生年月日;

...

public 社員() {

社員番号 = null;

氏名 = null;

生年月日 = null;

...

}

public get社員番号() {

return this.社員番号;

}

public set社員番号(final String 社員番号) {

this.社員番号 = 社員番号;

}

...

}

||<

というように、「社員」の情報を持つためだけのクラスを作ります。

これをHashMapで管理するとすれば

>|java|

Map 社員たち = new HashMap();

// 社員Aを作る

社員 社員A = new 社員();

社員A.set社員番号("000001");

...

// 社員AをHashMapに追加

社員たち.put(社員A.get社員番号, 社員A);

// 社員Bを作る

社員 社員B = new 社員();

社員B.set社員番号("000002");

...

// 社員BをHashMapに追加

社員たち.put(社員B.get社員番号, 社員B);

||<

というような感じです。


もし、key1, key2, …が各mainkeyで共通でない場合は多次元連想配列を作ることになるかと思います。

参考ページ: @IT:Java TIPS -- 2次元のキーを持つハッシュデータを作る http://www.atmarkit.co.jp/fjava/javatips/081java010.html


参考ページでは、HashMap×HashMapやHashMap×Listで多次元連想配列を作っているようです。

id:yshkw

こんなに詳しくありがとうございました。

一般的な作り方がわかったのですっきりです。

2008/03/16 18:33:54

その他の回答3件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント1pt

インスタンスをaddする理由が分かりません。後半でgetでfieldsの実体を取り出そうとしているところから、MyObjectの実体をaddすべきではないでしょうか。下記のサンプルを参考にしてください。

id:yshkw

ご回答ありがとうございます。関係ありませんが、アイコンかっこいい・・・。

さて、少し長くなりますが

>>インスタンスをaddする理由

私もわかっていないと思うので良かったら一緒に検討してくださいませんか?

以下のようなデータ構造を実現するのが目的です。

array(

mainkey1 => array(

key1=>value11

key2=>value12

...

)

mainkey2 => array(

key1=>value21

key2=>value22

...

)

....

)

そこで、インスタンスをはさんで

value11=ArrayList[mainkey1].key1

value12=ArrayList[mainkey1].key2

value21=ArrayList[mainkey2].key1

value22=ArrayList[mainkey2].key2

...

のような形を直感的に利用しました。pahooさんの回答はこれが一般的ではないというご指摘だと理解しています。

300近いmainkeyに対応するインスタンスを生成してArrayListに入れるは妙な操作なのかもしれませんが、まだその辺の感覚が身についていません。

Hashmapを入れ子にする案もありましたが慣れなくて、

value11=hashmap_key1.get(mainkey1)

value21=hashmap_key1.get(mainkey2)

value12=hashmap_key2.get(mainkey2)

value22=hashmap_key2.get(mainkey2)

のようにhashmapをフィールドの数だけ用意する汚いものしか思いつきませんでした。

目的は上記のようなデータ構造を持つ、多次元の連想配列を実現することですが、一般的にはどうするのでしょうか?

2008/03/12 21:05:03
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント30pt

ArrayList#get の返り値が Object 型であることが問題


従来のやり方。キャストする。

MyObject getobject = (MyObject)myobject_set.get(0);
((MyObject)myobject_set.get(0)).fields

ジェネリクスを使うやり方。

J2SE 5.0 Tiger 虎の穴 Generics

ArrayList<MyObject> myobject_set = new ArrayList<MyObject>();
myobject_set.add(myobject);
MyObject getobject = myobject_set.get(0);
myobject_set.get(0).fields;
id:yshkw

キャストとジェネリクス、勉強不足でした。

これで解決しました。

2008/03/12 21:29:28
id:KUROX No.3

回答回数3542ベストアンサー獲得回数140

ポイント10pt

getobject =(MyObject)(myobject_set.get(0));

id:yshkw

ありがとうございます。これで解決しました。

2008/03/12 21:29:24
id:blueberrystream No.4

回答回数34ベストアンサー獲得回数5ここでベストアンサー

ポイント50pt

目的は上記のようなデータ構造を持つ、多次元の連想配列を実現することですが、一般的にはどうするのでしょうか?

こちらについてですが、key1, key2, …が各mainkeyで共通なのであれば、データクラスを作成して、

そのクラスをHashMapクラスで管理したり、そのクラスを束ねて管理するためのクラスを作ったりするのが一般的かと思います。

例として社員管理のことを考えると、mainkeyを社員番号、key1を氏名、key2を生年月日…とすると

>|java|

class 社員 {

private String 社員番号;

private String 氏名;

private String 生年月日;

...

public 社員() {

社員番号 = null;

氏名 = null;

生年月日 = null;

...

}

public get社員番号() {

return this.社員番号;

}

public set社員番号(final String 社員番号) {

this.社員番号 = 社員番号;

}

...

}

||<

というように、「社員」の情報を持つためだけのクラスを作ります。

これをHashMapで管理するとすれば

>|java|

Map 社員たち = new HashMap();

// 社員Aを作る

社員 社員A = new 社員();

社員A.set社員番号("000001");

...

// 社員AをHashMapに追加

社員たち.put(社員A.get社員番号, 社員A);

// 社員Bを作る

社員 社員B = new 社員();

社員B.set社員番号("000002");

...

// 社員BをHashMapに追加

社員たち.put(社員B.get社員番号, 社員B);

||<

というような感じです。


もし、key1, key2, …が各mainkeyで共通でない場合は多次元連想配列を作ることになるかと思います。

参考ページ: @IT:Java TIPS -- 2次元のキーを持つハッシュデータを作る http://www.atmarkit.co.jp/fjava/javatips/081java010.html


参考ページでは、HashMap×HashMapやHashMap×Listで多次元連想配列を作っているようです。

id:yshkw

こんなに詳しくありがとうございました。

一般的な作り方がわかったのですっきりです。

2008/03/16 18:33:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません