インスタンスを追加した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の取り出し方について、どなたか教えてくださいませんか?
目的は上記のようなデータ構造を持つ、多次元の連想配列を実現することですが、一般的にはどうするのでしょうか?
こちらについてですが、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で多次元連想配列を作っているようです。
インスタンスをaddする理由が分かりません。後半でgetでfieldsの実体を取り出そうとしているところから、MyObjectの実体をaddすべきではないでしょうか。下記のサンプルを参考にしてください。
ご回答ありがとうございます。関係ありませんが、アイコンかっこいい・・・。
さて、少し長くなりますが
>>インスタンスを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をフィールドの数だけ用意する汚いものしか思いつきませんでした。
目的は上記のようなデータ構造を持つ、多次元の連想配列を実現することですが、一般的にはどうするのでしょうか?
ArrayList#get の返り値が Object 型であることが問題
従来のやり方。キャストする。
MyObject getobject = (MyObject)myobject_set.get(0);
((MyObject)myobject_set.get(0)).fields
ジェネリクスを使うやり方。
ArrayList<MyObject> myobject_set = new ArrayList<MyObject>(); myobject_set.add(myobject); MyObject getobject = myobject_set.get(0); myobject_set.get(0).fields;
キャストとジェネリクス、勉強不足でした。
これで解決しました。
目的は上記のようなデータ構造を持つ、多次元の連想配列を実現することですが、一般的にはどうするのでしょうか?
こちらについてですが、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で多次元連想配列を作っているようです。
こんなに詳しくありがとうございました。
一般的な作り方がわかったのですっきりです。
こんなに詳しくありがとうございました。
一般的な作り方がわかったのですっきりです。