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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3887閲覧

javaの2次元配列について

mesomeso

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2016/02/04 07:46

編集2016/02/05 01:16

現在javaを勉強中です。

txt(String)ファイルを2次元配列で読み込みたいのですが、一行ずつの読み込みはうまくいくのですが、","で区切られた読み込みがなかなかうまくいきません。

他の方の質問などを調べて参考にしてはみたのですが、どうにもうまくいきません。

やりたいこととしては、
assetsフォルダにあるtxtファイル(","区切りの文字列)をStringで格納したいです。
ただ、txtファイルが複数有り、行列が4×5・10×3などと内容が違うため使い回しができるようにしたいのですが・・・

よろしくお願い致します。

追記:
説明不足で申し訳ありません。
一行ずつ出力できたのはこちらのコードになります。

InputStream is = null; BufferedReader br = null; String text = ""; try { try { is = this.getAssets().open("2-1.txt"); br = new BufferedReader(new InputStreamReader(is)); String str; while ((str = br.readLine()) != null) { text += str + "\n"; } } finally { if (is != null) is.close(); if (br != null) br.close(); } } catch (Exception e){ // エラー用の何かしらの処理 } Log.d("*************",text);

現在途中まで書いているコードがこちらになります。

String[][] nums; List<String> temp = new ArrayList<String>(); AssetManager as = getResources().getAssets(); try{ InputStream is = as.open("2-1.txt"); try (BufferedReader br = new BufferedReader(new InputStreamReader(is))){ String line; while((line = br.readLine()) != null){ temp.add(line); } //2-1.txt(9行4列) nums = new String[9][temp.size()]; for(int i = 0; i < temp.size(); i++){ String[] s = temp.get(i).split(", "); for(int j = 0; j < 9; j++){ nums[j][i] = String.valueOf(s[j]); } } for(int i = 0; i<nums.length; i++){ for(int j = 0; j<nums[0].length; j++){ System.out.println(nums[i][j]); Log.d("**************",nums[i][j]); } } } finally { if (is != null) is.close(); } }catch (IOException e){ e.printStackTrace(); }

どちらもほぼ他からコピペしたものです。

https://teratail.com/questions/16077

使い回しについては、
行や列の違う複数のtxtファイルをアドレスを変えても使用できるようにしたいと考えております。

追記02:
エラーコードの全文があったほうが良いとのことなので追記せさせていただきます。

02-04 09:30:14.994 5482-5482/com.example.kshinohara.uranai_01 E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.kshinohara.uranai_01, PID: 5482 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.kshinohara.uranai_01/com.example.kshinohara.uranai_01.SeatActivity}: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2411) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5401) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:725) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615) Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at com.example.kshinohara.uranai_01.SeatActivity.onCreate(SeatActivity.java:71) at android.app.Activity.performCreate(Activity.java:6116) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470)             at android.app.ActivityThread.-wrap11(ActivityThread.java)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:148)             at android.app.ActivityThread.main(ActivityThread.java:5401)             at java.lang.reflect.Method.invoke(Native Method)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:725)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:615)

追記:
71行目は

nums[j][i] = String.valueOf(s[j]);

の部分です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

u.-_-.u

2016/02/04 07:54

現状の把握が出来ません。 中々うまくいかないというのは、エラーが出るのでしょうか? 今はどの様に実装しているのでしょうか? 具体的に記載してください。
sk_3122

2016/02/04 08:03

どこまでできているのか、 「ファイルの読み込みまではできているのか」 「一行ずつ取り出すところまではできているけどカンマでの分割がわからないのか、分割したつもりだけどできてないのか」 「空白になってしまうのか、例外が出るのか」 みたいなことを書くと良いと思います。 途中までできてるソースなんかがあれば、張り付けるのが一番早いですが。
coco_bauer

2016/02/04 08:25

","で区切られた文字列(1行を入力したもの)を、個々の文字列に分けるにはsplit関数が使えます。 質問の『使い回し』という言葉が、具体的に何を意味しているのかが不明です。説明を補足してください。
swordone

2016/02/05 00:59

SeatActivityの71行目はどこですか?
guest

回答3

0

CSVファイルをString[][]に保持したいという事でしょうか?
それなら手順は下記のようになります。
1-ファイルを行毎に読み込み、ArrayListに格納する。
2-各行の文字列に対してString#splitを行い、最大列数を取得する。
3-String[ArrayList#size][2で求めた最大値]の2次元配列を作成する。
4-文字列を2次元配列に格納する。

質問の時はなるべく一般的な名前や言い回しを使う必要があります。難しいんですけどね
assetsフォルダにある。
→どこのフォルダにあるかは質問には関係ないですね。
txtファイル(","区切りの文字列)
→CSVファイルのことですね。
使い回しができるようにしたいのですが・・・
→汎用的にしたい。

投稿2016/02/04 08:54

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at com.example.kshinohara.uranai_01.SeatActivity.onCreate(SeatActivity.java:71)

長さが1の配列なのに、存在しないインデックス番号1を参照しようとしたための例外です。

java

1String[] s = temp.get(i).split(", "); 2for(int j = 0; j < 9; j++){ 3 nums[j][i] = String.valueOf(s[j]); 4}

splitで配列化していますが、対象の文字列の中に", "という文字列が存在しなければ、このメソッドで生成される配列の長さは1です。
それなのにその後のforループで9回回そうとしたものだから、例外が発生しているようです。
対象の文字列をもう一度確認してください。
おそらく、","(半角スペースがない)のが正しいのでは?

投稿2016/02/05 01:24

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、ArrayIndexOutOfBoundsException は
たとえばサイズ 5 しかない配列 tmp に tmp[8] とかでアクセスしようとすると出るエラーですね。

エラーの情報として、ArrayIndexOutOfBoundsException 以外に
エラーが出ているソースのファイル名とその行番号がずらずらと出ていませんかね。
それを見ると、具体的にどこでエラーになっているのかが分かるのですが。

投稿2016/02/04 09:17

sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問