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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

4回答

2033閲覧

行列データ 配列 格納

pro

総合スコア28

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/02/02 07:20

編集2017/02/02 08:47

###前提・実現したいこと
3行3列のテキストデータを読み込み3行3列の配列に格納
行数は不確定にする予定

お願いいたします。
###発生している問題・エラーメッセージ

1行目しか配列に入らない

###該当のソースコード

is = this.getAssets().open("sample.txt"); br = new BufferedReader(new InputStreamReader(is)); String str; while ((str = br.readLine()) != null) { text.add(str); } nums = new int[text.size()][3]; for (int i = 0; i < text.size(); i++) { String[] s = text.get(i).split(" "); for (int j = 0; j < 3; j++) { nums[i][j] = (int) Integer.parseInt(s[j]); }

###試したこと

行数は不確定になる場合のためArrayListを用意
1行目はすべて配列に入った

textView.setText(String.valueOf(nums[0][2]))は該当数字が表示され、textView.setText(String.valueOf(nums[2][0]))は0が表示されてしまいます。

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

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

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

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

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

guest

回答4

0

textの型がArrayList<String>だとすると上のプログラムで動くような気がします。
1行しかできなかったということであればsample.txtが1行しかなかったのだと思います。

java

1String str; 2while ((str = br.readLine()) != null) { 3 text.add(str); 4} 5Log.d("xxx", "line count = " + text.size()); 6...

これでログに"line count = 1"と出るんじゃないんでしょうか。

あるいは他の可能性として「2行目に数字が3要素未満しかなかった」「2行目に空白が2つ連続していた」等々で例外が発生していたとも考えられますが・・・

投稿2017/02/02 08:25

KSwordOfHaste

総合スコア18394

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

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

pro

2017/02/02 08:37

回答ありがとうございます。 textの型がArrayList<String>で、line countは3でした。
KSwordOfHaste

2017/02/02 08:44

KiyoshiMotokiさんへのコメントでわかりました・・・ そもそも数字3要素という前提が崩れている入力ですね・・・ 途中で例外が発生するということでしょう。
pro

2017/02/02 08:51

KiyoshiMotokiさんに対する返信は間違えました。 ログ出力はスペースで区切られたものでした。
guest

0

Java SE 8以降なら????

lang

1 2is = this.getAssets().open("sample.txt"); 3BufferedReader br = new BufferedReader(new InputStreamReader(is)); 4int[][] matrix = br.lines() 5 .map(line -> 6 Stream.of(line.split(" ")) 7 .mapToInt(Integer::parseInt) 8 .toArray()) 9 .toArray(int[][]::new);

投稿2017/02/02 08:21

carimatics

総合スコア740

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

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

0

ソースコードが途中で途切れているように見えます。もしかして、この先にbreakが潜んでいたりしませんか?見えているコードは問題なさそうなので、sample.txtが1行しかないか、breakされて1行目しか処理されないか、出力するときに間違えて1行目のデータしか見ていないか、のどれかかと思います。

投稿2017/02/02 08:20

masaya_ohashi

総合スコア9206

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

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

0

ベストアンサー

sample.txt

1 2 3 4 5 6 7 8 9

Main.java

java

1import java.io.BufferedReader; 2import java.io.FileInputStream; 3import java.io.FileNotFoundException; 4import java.io.IOException; 5import java.io.InputStream; 6import java.io.InputStreamReader; 7import java.util.ArrayList; 8import java.util.List; 9 10public class Main { 11 12 public static void main(String[] args) throws IOException { 13 List<String> text = new ArrayList<String>(); 14 int[][] nums; 15 16 InputStream is; 17 BufferedReader br; 18 19 //////////////////////////////////////////////////////// 20 is = new FileInputStream("sample.txt"); 21 br = new BufferedReader(new InputStreamReader(is)); 22 23 String str; 24 while ((str = br.readLine()) != null) { 25 text.add(str); 26 27 } 28 nums = new int[text.size()][3]; 29 for (int i = 0; i < text.size(); i++) { 30 String[] s = text.get(i).split(" "); 31 for (int j = 0; j < 3; j++) { 32 nums[i][j] = (int) Integer.parseInt(s[j]); 33 } 34 } 35 //////////////////////////////////////////////////////// 36 37 for (int[] num : nums) { 38 for (int n : num) { 39 System.out.print(n + ","); 40 } 41 System.out.println(); 42 } 43 } 44 45}

実行結果

1,2,3, 4,5,6, 7,8,9,

おそらく、sample.txtが意図するフォーマットになっていないと思われます。
以下のようにデバッグコードを追加し、logcat にどのように表示されるか確認してみてください。

Before

java

1while ((str = br.readLine()) != null) { 2 text.add(str); 3 4}
After

java

1while ((str = br.readLine()) != null) { 2 Log.e("My App", str); 3 text.add(str); 4}

追記

sample.txt

1 2 3 4 5 6 0 7 8 9 10 11 12

Main.java

java

1import java.io.BufferedReader; 2import java.io.FileInputStream; 3import java.io.IOException; 4import java.io.InputStream; 5import java.io.InputStreamReader; 6import java.util.ArrayList; 7import java.util.List; 8 9public class Main { 10 11 public static void main(String[] args) throws IOException { 12 int[][] nums; 13 14 InputStream is; 15 BufferedReader br; 16 17 // ////////////////////////////////////////////////////// 18 is = new FileInputStream("sample.txt"); 19 br = new BufferedReader(new InputStreamReader(is)); 20 21 List<int[]> table = new ArrayList<int[]>(); 22 23 String str; 24 while ((str = br.readLine()) != null) { 25 String[] splitted = str.trim().split(" "); 26 if (splitted.length < 3) { 27 throw new IllegalStateException("Too few element."); 28 } 29 30 int[] row = new int[3]; 31 for (int i = 0; i < 3; i++) { 32 row[i] = Integer.parseInt(splitted[i]); 33 } 34 table.add(row); 35 } 36 nums = table.toArray(new int[][] {}); 37 // ////////////////////////////////////////////////////// 38 39 for (int[] num : nums) { 40 for (int n : num) { 41 System.out.print(n + ","); 42 } 43 System.out.println(); 44 } 45 } 46}

実行結果

1,2,3, 4,5,6, 7,8,9, 10,11,12,

投稿2017/02/02 08:15

編集2017/02/02 09:32
KiyoshiMotoki

総合スコア4791

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

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

pro

2017/02/02 10:22 編集

回答ありがとうございます。 ログ出力してみたところこのように出ました。。。 E/My App:1 2 3 E/My App:4 5 6 E/My App:7 8 9
KiyoshiMotoki

2017/02/02 08:46

つまり、sample.txt の内容は 123 456 789 のようになっている、ということです。 しかし、ご提示のソースコードは、 1 2 3 4 5 6 7 8 9 という、各数字がスペース 1文字で区切られていることを期待したものになっています。 現状の sample.txt とソースコード、どちらがあなたの意図する sample.txt のフォーマットですか?
pro

2017/02/02 08:48

スペースで区切ったものが意図しているフォーマットです。
pro

2017/02/02 08:49

ログ出力はスペースで区切られてました、すみません
KiyoshiMotoki

2017/02/02 09:35 編集

> ログ出力はスペースで区切られてました、すみません しかし、ご提示のログはスペースで区切られていません。 そのため、あなたの仰ることが本当に正しいのか、私には確証が持てません。 情報を提示する際は下手にご自分で編集したりせず、なるべくそのままコピペするようにしてください。 https://teratail.com/help/question-tips#questionTips3-4-2 とりあえず、sample.txt は本当に「スペースで区切られて」いるという前提で正しく動作するコードを回答欄に追記しました。 確認してみてください。 それでも > 1行目しか配列に入らない ということは、コードのどこかで例外が発生し、ループを抜けてしまっている、という可能性が考えられます。 (例えば、sample.txt の中にスペース2文字以上で区切られている箇所がある、など) その際は、以下を参考にデバッグしてみてください。 https://developer.android.com/studio/debug/index.html?hl=ja#breakPoints
pro

2017/02/02 10:41

ご指摘ありがとうございます。 提示してくださったコードを元に考えたいと思います。
pro

2017/02/03 06:09

無事解決しました。 問題点は複数For分の構成でした。 ご丁寧な解説ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問