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

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

0

リストを配列に変換出来ません。

mapの中身を取り出し、変数への代入を行いたいですが、値のキャストが出来ません。最初にソースから記します。

*****************************************

Set entries = map.entrySet();

for (Iterator iterator = entries.iterator(); iterator.hasNext();){
    
    Map.Entry entry = (Map.Entry)iterator.next();    
    
    //mapから問題文をString型へ
    String question = (String)entry.getKey();
  
    //mapから解答選択肢をString[]型へ
  String[] answer = (String[])mapLst.toArray(new String[]{});

  System.out.println("問題文は・・・" + question);
    System.out.println("解答選択肢は・・・" + answer);  
}

*****************************************

mapの中身はキー(問題文)がString型で値(解答選択肢)がList型になっています。mapの中身がどうなっているかというと例として、

{"この色は何色ですか?" , [赤 , 青 , 黄 , 緑]}

といった感じです。問題文は例外も無く進んだのですが、値のキャスト部分でどうしても例外がでてしまいます。
例外は「java.lang.ArrayStoreException」が出ます。例外内容を調べはしたのですが、どうしても解決までたどり着くことが出来ません。

状況説明に至らない部分があるとは思いますが、宜しくお願い致します。

14

回答

8584

閲覧

14件の回答

評価

0

ん?
String[] answer = (String[])mapLst.toArray(new String[]{});
これは
String[] answer = map.get(question);
これではとってはこれないのですか?

評価

0

>例外内容を調べはしたのですが、どうしても解決までたどり着くことが出来ません。
まず、例外の内容はどう理解した?
それがなぜ、自分のコードで起きるか。

プログラムは、思ったとおりに動作するのではなく、書いたとおりに動作する。
思ったとおりに動かないのなら、それは書いた内容や前提が、思っていることと違うということになる。

それ以前に、突然現れるmapLstは何?
不必要な部分をはしょるのは良いが、必要な部分まで消していないか、ちゃんと確認しないと。

評価

0

すいません、大事な部分を書き忘れたので補足です。Stringquestion = (String)entry.getKey();の下に、


List mapLst = new ArrayList();
mapLst = (List)entry.getValue();


この2行が入ります。失礼しました。


評価

0

>コロさん

>値(解答選択肢)がList型になっています。

評価

0

>List mapLst = new ArrayList();
>mapLst = (List)entry.getValue();

これ、理解して書いてる?

評価

0

entry.getValue()がObject型なので、List型に直すという認識で書いていました。

評価

0

>entry.getValue()がObject型なので、List型に直すという認識で書いていました。
それは2行目。1行目は?

それと、2008-10-07 10:53への返答は?

評価

0

AKさんのやり方で間違ってないと思います。
2点を除いてはですが。

1つは、java.lang.ArrayStoreException が発生したと言われてもどの行でExceptionがスローされたのかが分からないとほかの方も原因がわからないです。

コードで間違ってる点ですが、
> String[] answer = (String[])mapLst.toArray(new String[]{});

これがどう見てもおかしいです。
toArrayでObject[]に変換してるのに引数にnew String[]{}で空のStringオブジェクトを引数に渡してる・・・。

引数に書いてあるnew String[]{} は、変換した配列を入れる入れ物なので(リファレンス参照)それが空じゃエラーがでるのは当然でしょう。

評価

0

oh.失礼を。
っと言ってる間に答えが出ちゃいましたね。

評価

0

補足で。
jdkが1.5↑なら、
ジェネリクスをつけるのが最優先な気がするのは私だけでしょうか?

答えへの近道はtoArrayの引数を調べる事だと思うのですが。

評価

0

>これがどう見てもおかしいです。
違う。<T> T[] toArray(T[] a)のJavaDocを見ること。


>ジェネリクスをつけるのが最優先な気がする
おそらくそれで見つけられる。

評価

0

>> String[] answer = (String[])mapLst.toArray(new String[]{});
>これがどう見てもおかしいです。

手元でやってみたが、コンパイルも通ったし、
ちゃんと実行もできたぞ。
JDKのバージョンは1.5.0_08。
無名クラスの場合は、配列サイズの指定が無くても、
サイズ0の配列が作れるのか。
初めて知った。

ArrayStoreExceptionの原因はわからんが。

つか、mapにどうやって値を設定してるのか、
その辺をあげてくれ。

評価

0

仕方ない。ArrayStoreExceptionを発生させるサンプル。

List a = new ArrayList();
a.add(1);
String[] b = (String[])a.toArray(new String[]{});

評価

0

>> String[] answer = (String[])mapLst.toArray(new String[]{});
>これがどう見てもおかしいです。

String[] answer = (String[])mapLst.toArray(new String[mapLst.size()]);

という形でやってたので、自分の勘違いだったようです。すみません。

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