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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア20669
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
総合スコア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総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/11 11:29
2015/09/13 03:21
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総合スコア9394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/11 13:39
2015/09/13 03:22
2015/09/13 03:33
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総合スコア9058
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/13 03:21