質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

CSVを読み込んだあとの型変換

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,523

sobue

score 223

public void actionPerformed(ActionEvent e) {
        // TODO 自動生成されたメソッド・スタブ
        int x = 0;
        int y = 0;
        JFileChooser fileChooser = new JFileChooser();
        // SaveDialogを表示させる
        int selected = fileChooser.showOpenDialog(this);

        if (selected == fileChooser.APPROVE_OPTION) {
            try {
                FileReader fileReader = new FileReader(fileChooser.getSelectedFile());
                BufferedReader bufferedReader = new BufferedReader(fileReader);

                String line;
                StringTokenizer token;

                while ((line = bufferedReader.readLine()) != null) {
                    token = new StringTokenizer(line, ",");
                    while (token.hasMoreTokens()) {
                if (x<MASS){
                            boardarray[x][y]=Integer.valueOf(token.nextToken());
                            x++;
                        }else if(y<MASS){
                            boardarray[x][y]=Integer.valueOf(token.nextToken());
                            y++;
                        }
                    }

                }
                bufferedReader.close();
            } catch (Exception ex) {
                // TODO: handle exception
                ex.printStackTrace();
            }

        }
    }


上記のコードで
boardarray[x][y]=Integer.valueOf(token.nextToken());
の処理を読むとエラーになります。
中身は確認して数字であることは間違いないのですがCSV読み込みの型変換はできないのでしょうか?

すみません、補足です。
java.lang.ArrayIndexOutOfBoundsException: 10
このエラーメッセージが出ます。
ですので、配列の問題かと色々いじってはみたのですが
                        if (x<MASS){
                            boardarray[x][y]=Integer.valueOf(token.nextToken());
                            x++;
                        }else if(y<MASS){
                            boardarray[x][y]=Integer.valueOf(token.nextToken());
                            y++;
}
この部分でyの部分だけ消すとフリーズします。エラーメッセージは出ません。

補足
java.lang.ArrayIndexOutOfBoundsException: 10
    at picross_play.Playboard.actionPerformed(Playboard.java:84)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6535)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
エラーです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2016/04/10 19:06

    エラー(例外)のログを出してください。

    キャンセル

  • KiyoshiMotoki

    2016/04/11 19:24

    "java.lang.ArrayIndexOutOfBoundsException: 10 "だけでは、ソースコードのどの箇所でエラーが発生しているか特定できません。表示されるエラーメッセージを【省略せず】、全て記載してください。

    キャンセル

  • KiyoshiMotoki

    2016/04/11 21:44

    情報の追記、ありがとうございます。 追記いただいたエラーメッセージの2行目にある"Playboard.java:84"は、Playboard.javaファイルの84行目でこのエラーが発生したことを示しています。 お手数ですが、該当箇所がどこか、再度 追記願います。

    キャンセル

回答 4

checkベストアンサー

0

どんなエラーでしょうか?

改行コードが紛れ込んでいたりしませんか?

2016/04/11 追記

下記の部分が問題ありますね。
まず、xとyが増え続ける一方です。

while ((line = bufferedReader.readLine()) != null) {
    token = new StringTokenizer(line, ",");
    while (token.hasMoreTokens()) {
        if (x<MASS){
            boardarray[x][y]=Integer.valueOf(token.nextToken());
            x++;
        }else if(y<MASS){
            boardarray[x][y]=Integer.valueOf(token.nextToken());
            y++;
        }
    }

}

ここでやりたいことは、一行舐めるごとにxを0にし、yをインクリメントではないですか?
おそらく下記のようになるかと。

while ((line = bufferedReader.readLine()) != null) {
    // 外側のループは各行、つまりyに対応
    token = new StringTokenizer(line, ",");
    while (token.hasMoreTokens()) {
        //内側のループは、横方向のマスに、つまりxに対応
        if (x<MASS && y<MASS){
            // csvのxとyが範囲内ならboardArrayに反映
            boardarray[x][y]=Integer.valueOf(token.nextToken());
        }
        x++;
    }
    x = 0;
    y++;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/13 22:03

    x = 0;
    y++;
    の直前のX=0;のやっている意味がわかりません。
    教えていただけますか?

    キャンセル

  • 2016/04/14 16:01

    CSVファイルの2行目、3行目...といったとき(yを1増やす)に、横方向(x)を0に戻す必要があるのはわかりますか?

    下記のように考えてみてください。xを0に戻す必要性が理解できると思います。

    CSVの1行目を取得するとき、yを0に固定してxを0からMASS-1まで動かす。
    CSVの2行目を取得するとき、yを1に固定してxを0からMASS-1まで動かす。
    ...
    CSVのn行目を取得するとき、yをn-1に固定してxを0からMASS-1まで動かす。
    ...
    CSVのMASS行目を取得するとき、yをMASS-1に固定してxを0からMASS-1まで動かす。

    キャンセル

  • 2016/04/16 21:50

    丁寧な説明ありがとうございます。

    キャンセル

0

とりあえず今のままだと、
x,yが(0,0),(1,0),...,(MASS-1,0),(MASS-1,1),(MASS-1,2),...,(MASS-1,MASS-1)
という変化になっておそらく望む順番にならないと思います。
yを消してエラーにならずフリーズ(おそらく無限ループ)しているということは、boardarrayの2次元目の長さを間違えている可能性があるのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/16 21:51

    いつも、ありがとうございます。

    キャンセル

0

boardarrayの変数宣言部分が見つかりませんでした。
書き漏れだったらすみません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/11 21:11

    書き漏れではなく必要ないと思ったので割愛しております。
    public class Playboard extends JFrame implements ActionListener {

    JPanel buttonpanel = new JPanel();
    JButton btn = new JButton("CSV出力");
    int[][] boardarray = new int[MASS][MASS];

    public Playboard() {
    一番上にこれがきます。

    キャンセル

0

処理順序の誤りのようです。
そのプログラムですと、以下のような処理がされます。

[プログラム補足]
MASS=5だと仮定します。

[読み込むCSVファイル]
1,2,3,4,5
6,7,8,9,10

[処理順序]
if文でxがMASSを超えるまで、[0][0]、[1][0]、[2][0]・・・というようにXが加算されていきます。
この状態は、CSVファイル一行目が読み込み終わるまで続きます。

この時の変数の値は、配列への代入後インクリメントされますので、
x=6 y=0となります。

これ以降は、x<MASSが常にfalseとなるため、y<MASSの条件の処理に移ります。
その時、xの値が配列のlengthと同値となっており、
初期化した際に宣言したIndexを超えている=ArrayIndexOutOfBoundsExceptionがthrowされます。
それがエラーの発生理由です。

望ましい処理については、他の方が記載されてますので、割愛します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/16 21:51

    ありがとうございます。考えの助けになりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る