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

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

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

integerは、一般的に整数を表します。プラスやマイナス、ゼロもなりうる全ての数です。(例 : -2, -1, 0, 1, 2...)

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

7回答

26294閲覧

javaでテキストファイルの数字をint配列に代入するコードについて

yamatesoccer07

総合スコア32

integer

integerは、一般的に整数を表します。プラスやマイナス、ゼロもなりうる全ての数です。(例 : -2, -1, 0, 1, 2...)

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

2クリップ

投稿2015/09/11 08:07

02 34 343
34 23 532
324 4325 543
23 33 43
... ... ...
... ... ...

というテキストファイルがあったときに、
a配列に 02 34 324 23 ....
b配列に 34 23 4325 33 ....
c配列に 343 532 543 43 ....

と代入したいのですが、コードをおしえてもらえませんか。
お願いします。

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

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

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

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

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

guest

回答7

0

例から推察するに,もとの並びを転置する必要があるので,それをコードに起こします.
必要な配列の数が3で固定ならば,3×nの2次元配列を作るのがわかりやすいと思います.
nが開始時点で不明なので,ファイルを最後まで読んでその読み込んだ行数で判断することにします.

java

1import java.util.*; 2import java.io.*; 3 4public class ReadNums{ 5 6 public static void main (String[] args){ 7 int[][] nums; 8 List<String> temp = new ArrayList<String>(); 9 try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))){ 10 String line; 11 //ファイルから読み込んだ行を一旦リストに入れておく 12 while((line = br.readLine()) != null){ 13 temp.add(line); 14 } 15 //2次元配列を3×(読み込んだ行数)で初期化 16 nums = new int[3][temp.size()]; 17 //文字列を空白で分割し,数値解析して配列に格納 18 for(int i = 0; i < temp.size(); i++){ 19 String[] s = temp.get(i).split(" "); 20 for(int j = 0; j < 3; j++){ 21 nums[j][i] = Integer.parseInt(s[j]); 22 } 23 } 24 //各行に格納した数値を出力 25 for(int i = 0; i < 3; i++){ 26 System.out.println(Arrays.toString(nums[i])); 27 } 28 }catch (IOException e){ 29 e.printStackTrace(); 30 } 31 } 32}

投稿2015/09/11 09:46

編集2015/09/13 04:10
swordone

総合スコア20669

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

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

yamatesoccer07

2015/09/13 03:21

無事解決することができました 。 ありがとうございました。
guest

0

katoy の回答を Stream, 拡張for をつかって書きなおしてみました。

java

1import java.io.IOException; 2import java.nio.file.Files; 3import java.nio.file.Paths; 4import java.util.ArrayList; 5import java.util.Arrays; 6import java.util.List; 7import java.util.stream.Stream; 8 9public class ReadInt { 10 public static void main(String[] args) { 11 try { 12 do_action(args[0], 3); 13 } catch (Exception ex) { 14 ex.printStackTrace(); 15 } 16 } 17 18 public static void do_action(final String filename, final int num_array) throws IOException, Exception { 19 // ファイルの 1 行を int[] に変換して List に保存する。 20 List<int[]> lists = new ArrayList<int[]>(); 21 try { 22 Files.lines(Paths.get(filename)).forEach(line -> { 23 int[] ints = null; 24 try { 25 ints = Stream.of(line.split(" ")).mapToInt(Integer::parseInt).toArray(); 26 if (ints.length != num_array) { 27 throw new RuntimeException("Bad line: '" + line + "'"); 28 } 29 } catch (Exception ex) { 30 throw new RuntimeException(ex); // 非検査例外でラップ 31 } 32 lists.add(ints); 33 }); 34 } catch (RuntimeException re) { 35 Throwable ex = re.getCause(); // 元の例外を取り出す 36 throw new Exception(ex); 37 } 38 39 // lists を Integer[num_array][] に変換する 40 final int num = lists.size(); 41 Integer[][] i_arrays = new Integer[num_array][num]; 42 for (int idx = 0; idx < num; idx++) { 43 int[] ints = lists.get(idx); 44 for (int i = 0; i < 3; i++) { 45 i_arrays[i][idx] = ints[i]; 46 } 47 } 48 49 // Integer[] の内容を表示する 50 for (Integer[] ary : i_arrays) { 51 System.out.println("Integer[] = " + Arrays.toString(ary)); 52 } 53 } 54}

実行例

Integer[] = [2, 34, 324, 23] Integer[] = [34, 23, 4325, 33] Integer[] = [343, 532, 543, 43]

投稿2015/09/13 14:13

katoy

総合スコア22324

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

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

0

ベストアンサー

ファイルを一行ずつ読みます。
3 つの List<Integer> を用意します。
1行を3つの整数として解釈します。(解釈に失敗したら、例外を投げます)
それぞれの整数を List<Integer> の保存します。
全ての行を処理したら、List<Integer> を Integer[] に変換します。

java

1 2// See https://teratail.com/questions/16077 3 4import java.io.BufferedReader; 5import java.io.FileReader; 6import java.util.ArrayList; 7import java.util.List; 8import java.util.StringTokenizer; 9 10public class ReadInt { 11 public static void main(String[] args) { 12 do_action(args[0]); 13 } 14 15 public static void do_action(final String filename) { 16 List<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>(); 17 for (int i = 0; i < 3; i++) { 18 lists.add(new ArrayList<Integer>()); 19 } 20 BufferedReader br = null; 21 try { 22 // ファイルを読んで、3 つの List<Integer> に値を保存する 23 br = new BufferedReader(new FileReader(filename)); 24 String line = null; 25 while ((line = br.readLine()) != null) { 26 // 行の n 番目の整数を lists[n] に追加する。 27 List<Integer> ints = parse_line(line); 28 for (int i = 0; i < 3; i++) { 29 (lists.get(i)).add(ints.get(i)); 30 } 31 } 32 33 // lists を 3 つの Integer[] に変換する 34 Integer[] a = new Integer[lists.get(0).size()]; 35 lists.get(0).toArray(a); 36 Integer[] b = new Integer[lists.get(1).size()]; 37 lists.get(1).toArray(b); 38 Integer[] c = new Integer[lists.get(2).size()]; 39 lists.get(2).toArray(c); 40 41 // Integer[] の内容を表示する。 42 show_array(a, "a = "); 43 show_array(b, "b = "); 44 show_array(c, "c = "); 45 46 } catch (Exception ex) { 47 System.out.println(ex); 48 } finally { 49 try { 50 if (br != null) { 51 br.close(); 52 } 53 } catch (Exception ex) { 54 // ignore error 55 } 56 } 57 } 58 59 // 一行の文字列を 3 つの数字として parse する。 60 private static List<Integer> parse_line(String line) throws Exception { 61 List<Integer> ans = new ArrayList<Integer>(); 62 StringTokenizer st = new StringTokenizer(line, " "); 63 if (st.countTokens() != 3) { 64 throw new Exception("Bad line: [" + line + "]"); 65 } 66 while (st.hasMoreElements()) { 67 String s = st.nextToken(); 68 try { 69 ans.add(Integer.parseInt(s)); 70 } catch (Exception ex) { 71 throw new Exception("Bad Integer in " + "[" + line + "]. " + ex.getMessage()); 72 } 73 } 74 return ans; 75 } 76 77 // Integer[] の内容を表示する。 78 private static void show_array(Integer[] array, String message) { 79 System.out.print(message + "["); 80 StringBuilder sb = new StringBuilder(); 81 for (Integer val : array) { 82 if (sb.length() > 0) { 83 sb.append(", "); 84 } 85 sb.append(val); 86 } 87 System.out.println(sb + "]"); 88 }

次のテキストファイルを用意しました。
data.txt

02 34 343 34 23 532 324 4325 543 23 33 43

実行結果:

a = [2, 34, 324, 23] b = [34, 23, 4325, 33] c = [343, 532, 543, 43]

投稿2015/09/11 13:35

編集2015/09/13 10:35
katoy

総合スコア22324

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

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

yamatesoccer07

2015/09/13 03:20

悩んでいた内容そのものでした。 ありがとうございました。
guest

0

まず、コメントで処理のアウトラインを書いてみる。

public class App { public static void main( String[] args ) { // 1.ファイル読み込み準備 // 2.読み込み分割データを一時的に入れておくArrayListを準備 // 3.ファイルの行数分読み込み // 4.読み込んだ行をスペースで分割 // 5.分割した文字を、順番に応じたa,b,cのArrayListへ追加 // 6.ファイルを閉じる // 7.ArrayListを配列に変換する。 } }

どっかのサイトを参考に、ファイルの入出力部分を実装してみる。

public class App { public static void main( String[] args ) { // ↓try~catchの外で使いたいため、1よりも前に移動 // 2.読み込み分割データを一時的に入れておくArrayListを準備 // 1.ファイル読み込み準備 FileReader fr = null; BufferedReader br = null; try { fr = new FileReader("c:\\tmp\\file.txt"); br = new BufferedReader(fr); String line; // 3.ファイルの行数分読み込み while ((line = br.readLine()) != null) { // 4.読み込んだ行をスペースで分割 // 5.分割した文字を、順番に応じたa,b,cのArrayListへ追加 } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 6.ファイルを閉じる try { br.close(); fr.close(); } catch (IOException e) { e.printStackTrace(); } } // 7.ArrayListを配列に変換する。 } }

残りの実装を一つ一つ実装する。

public class App { public static void main( String[] args ) { // 2.読み込み分割データを一時的に入れておくArrayListを準備 List<String> listA = new ArrayList<String>(); List<String> listB = new ArrayList<String>(); List<String> listC = new ArrayList<String>(); // 1.ファイル読み込み準備 FileReader fr = null; BufferedReader br = null; try { fr = new FileReader("c:\\tmp\\file.txt"); br = new BufferedReader(fr); int num = 0; //←配列a,b,cに分けるためのカウンタ変数 String line; // 3.ファイルの行数分読み込み while ((line = br.readLine()) != null) { // 4.読み込んだ行をスペースで分割 String[] tmp = line.split(" "); // 5.分割した文字を、順番に応じたa,b,cのArrayListへ追加 for(String value: tmp) { List<String> selectList = null; int selectNum = num % 3; if(selectNum == 0) { selectList = listA; //←listA.add(value)と書きたくないので、ファクトリメソッドを採用 } else if(selectNum == 1) { selectList = listB; } else { selectList = listC; } selectList.add(value); num++; //←順番カウント } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 6.ファイルを閉じる try { br.close(); fr.close(); } catch (IOException e) { e.printStackTrace(); } } // 7.ArrayListを配列に変換する。 String[] a = (String[]) listA.toArray(new String[listA.size()]); String[] b = (String[]) listB.toArray(new String[listB.size()]); String[] c = (String[]) listC.toArray(new String[listC.size()]); // 確認 System.out.println("配列a"); for(String value : a) { System.out.print(value + " "); } System.out.println("\r\n配列b"); for(String value : b) { System.out.print(value + " "); } System.out.println("\r\n配列c"); for(String value : c) { System.out.print(value + " "); } } }

投稿2015/09/11 11:22

TetsujiMiwa

総合スコア1124

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

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

TetsujiMiwa

2015/09/11 11:29

int配列を見落としてました。 String配列になってしまってるけど、int配列に読み替えてください。
yamatesoccer07

2015/09/13 03:21

無事解決することができました 。 ありがとうございました。
guest

0

必ずこうしなければならないわけでは無いですが、
①ファイルを1行ずつ読み込む
②1行をString配列にする
String配列をint配列にする。
のように分けて考えると分かりやすいです。

int配列の数がいくつになることを想定しているか分かりませんので、それ以上は回答できません。

①ファイルを1行ずつ読み込む

Javaのバージョンによってもやり方が違うので、手前味噌で恐縮ですが、下記のブログを参考にしてください。
Javaで1行ずつテキストデータを読み込むイディオムの変遷 - argius note

Java7以上で使えるパターンを書いておきます。

lang

1// import java.util.*; // Iterator, Scanner 2 3// コンストラクター Scanner(File) は throws FileNotFoundException 4try (Scanner scanner = new Scanner(new File("ファイル名"))) { 5 while (scanner.hasNextLine()) { 6 String line = scanner.nextLine(); 7 // ... 8 } 9}

②1行をString配列にする

lineとして読み込んだ1行を半角スペースで分割するには、

lang

1String line = ...; 2String[] stringArray = line.split(" ");

とするのが手っ取り早いです。
Scanner.nextIntを使う手もありますが、配列に変換するのが面倒なので。

String配列をint配列にする。

いろいろやり方はありますが、どのようなケースでも対応できるようにシンプルに行きましょう。

lang

1String[] stringArray = ...; 2int n = stringArray.length; 3int[] intArray = new int[n]; 4for (int i = 0; i < n; i++) { 5 try { 6 intArray[i] = Integer.parseInt(stringArray[i]); 7 } catch (NumberFormatException e) { 8 // 文字列がintに変換できる形式でなかった場合 9 } 10}

(追記)

Java8だと、こういうやり方もあります。

lang

1import java.io.*; 2import java.nio.file.*; 3import java.util.*; 4import java.util.stream.*; 5 6public final class App { 7 8 public static void main(String[] args) { 9 try (Stream<String> lines = Files.lines(Paths.get("input.txt"))) { 10 lines.forEach(x -> { 11 int[] intArray = Stream.of(x.split(" ")).mapToInt(Integer::parseInt).toArray(); 12 System.out.println("int array=" + Arrays.toString(intArray)); 13 }); 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 } 18

投稿2015/09/11 09:31

編集2015/09/11 13:54
argius

総合スコア9394

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

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

argius

2015/09/11 13:39

int配列を表示するには、Arrays(java.util.Arrays)のtoString(int[])が使えます。 System.out.println("int array=" + Arrays.toString(intArray));
yamatesoccer07

2015/09/13 03:22

無事解決することができました 。 ありがとうございました。
argius

2015/09/13 03:33

ケチをつけるわけではないですが、 ベストアンサーの回答は「Javaの書き方としては」古かったりJava流ではなかったりしてお手本としてはあまりおすすめできません。 swordoneさんのほうがおすすめです。
guest

0

こんにちは。

入力するテキスト例の最後が、

23 33 43
... ... ...
... ... ...

と書かれていたので、行数は定まっていないと解釈しました。
とすると、aからzまでは26個なので、26行を超えると、何という名前の
変数に入れるのか不明なのですが、ご質問の一番の目的としては

23 33 43

のように、半角スペース区切りで数字が並んでいる、テキストファイルの各行から
整数の配列を作る方法を知りたい、ということなのかなと思いました。
この解釈で、StringTokenizerを使って作成したサンプルが以下です。

java

1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.IOException; 4import java.util.ArrayList; 5import java.util.List; 6import java.util.StringTokenizer; 7 8public class Q16077 { 9 10 // 読み込むテキストファイル名 11 private static final String INPUT_FILE = "inputs.txt"; 12 13 public static void main(String[] args) throws IOException { 14 15 // 読み込んだ内容を保持するためのリスト 16 List<Integer []> resultsList = new ArrayList<Integer []>(); 17 18 // 入力ストリームを開く 19 BufferedReader br = new BufferedReader(new FileReader(INPUT_FILE)); 20 21 // 各行を読み込むための文字列初期化 22 String line = null; 23 24 // 各行を読むループ 25 while ( (line = br.readLine()) != null ) { 26 // 各行の整数を保持するためのリスト初期化 27 List<Integer> integersList = new ArrayList<Integer>(); 28 29 // 読み込んだ行を、スペースで区切ってトークナイザを作成 30 StringTokenizer tknzr = new StringTokenizer(line, " "); 31 32 // 各トークンについて整数変換を試み、変換できればリストに追加 33 while ( tknzr.hasMoreElements() ) { 34 String s = tknzr.nextToken(); 35 try { 36 integersList.add(Integer.parseInt(s)); 37 } catch (NumberFormatException e) { 38 System.err.println("整数に変換できない文字列:" + s); 39 } 40 } 41 42 // 整数のリストを配列に変換して、読み込み結果を保持するリストに追加 43 Integer [] integersArray = integersList.toArray( new Integer[] {}); 44 resultsList.add(integersArray); 45 } 46 47 // 入力ストリームを閉じる 48 br.close(); 49 50 // 結果の表示 51 printResults(resultsList); 52 } 53 54 // 結果を表示するメソッド 55 private static void printResults(List<Integer []> resultsList) 56 { 57 final int numLines = resultsList.size(); 58 59 for ( int i = 0; i < numLines; ++ i ) { 60 System.out.print( (i+1) + "行目:"); 61 Integer[] a = resultsList.get(i); 62 for ( int j = 0; j < a.length; ++ j) { 63 System.out.print( (j > 0 ? " ":"") + a[j]); 64 } 65 System.out.println(); 66 } 67 } 68}

上記のコードで、while の中で行っていることが、各行から整数の配列を作るところになります。

たとえば、入力ファイル、inputs.txt が以下のようなもののとき

324 4325 543
23 33 43
10 20 30 40 50 60

上記のJAVAプログラムを実行すると、以下のように出力されます。

1行目:324 4325 543
2行目:23 33 43
3行目:10 20 30 40 50 60

また上記のプログラムでは、

  • 各行のスペースで区切られた数字の文字列が、4個以上でも正しい入力として処理
  • 各行のスペースで区切られた文字列の中に、整数に変換できないものがあれば、エラー表示

するようにしています。

以上、ご参考になれば幸いです。

投稿2015/09/11 09:12

編集2015/09/11 09:28
jun68ykt

総合スコア9058

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

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

yamatesoccer07

2015/09/13 03:22

無事解決することができました 。 ありがとうございました。
guest

0

ReadLineで1行ずつ読みこみ、split関数でスペース分割し2次元配列に入れ、2次元配列からa,b,c...配列へ入れればよいと思います。

投稿2015/09/11 08:25

Alice0225

総合スコア206

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問