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

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

ただいまの
回答率

88.04%

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

解決済

回答 7

投稿

  • 評価
  • クリップ 2
  • VIEW 18K+

score 24

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 ....

と代入したいのですが、コードをおしえてもらえませんか。
お願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 7

+1

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

public class ReadNums{
    
    public static void main (String[] args){
        int[][] nums;
        List<String> temp = new ArrayList<String>();
        try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))){
            String line;
            //ファイルから読み込んだ行を一旦リストに入れておく
            while((line = br.readLine()) != null){
                temp.add(line);
            }
            //2次元配列を3×(読み込んだ行数)で初期化
            nums = new int[3][temp.size()];
            //文字列を空白で分割し,数値解析して配列に格納
            for(int i = 0; i < temp.size(); i++){
                String[] s = temp.get(i).split(" ");
                for(int j = 0; j < 3; j++){
                    nums[j][i] = Integer.parseInt(s[j]);
                }
            }
            //各行に格納した数値を出力
            for(int i = 0; i < 3; i++){
                System.out.println(Arrays.toString(nums[i]));
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/09/13 12:21

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

    キャンセル

checkベストアンサー

0

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

// See https://teratail.com/questions/16077

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class ReadInt  {
    public static void main(String[] args) {
        do_action(args[0]);
    }

    public static void do_action(final String filename) {
        List<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
        for (int i = 0; i < 3; i++) {
            lists.add(new ArrayList<Integer>());
        }
        BufferedReader br = null;
        try {
            // ファイルを読んで、3 つの List<Integer> に値を保存する
            br = new BufferedReader(new FileReader(filename));
            String line = null;
            while ((line = br.readLine()) != null) {
                // 行の n 番目の整数を lists[n] に追加する。
                List<Integer> ints = parse_line(line);
                for (int i = 0; i < 3; i++) {
                    (lists.get(i)).add(ints.get(i));
                }
            }

            // lists を 3 つの Integer[] に変換する
            Integer[] a = new Integer[lists.get(0).size()];
            lists.get(0).toArray(a);
            Integer[] b = new Integer[lists.get(1).size()];
            lists.get(1).toArray(b);
            Integer[] c = new Integer[lists.get(2).size()];
            lists.get(2).toArray(c);

            // Integer[] の内容を表示する。
            show_array(a, "a = ");
            show_array(b, "b = ");
            show_array(c, "c = ");

        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (Exception ex) {
                // ignore error
            }
        }
    }

    // 一行の文字列を 3 つの数字として parse する。
    private static List<Integer> parse_line(String line) throws Exception {
        List<Integer> ans = new ArrayList<Integer>();
        StringTokenizer st = new StringTokenizer(line, " ");
        if (st.countTokens() != 3) {
            throw new Exception("Bad line: [" + line + "]");
        }
        while (st.hasMoreElements()) {
            String s = st.nextToken();
            try {
                ans.add(Integer.parseInt(s));
            } catch (Exception ex) {
                throw new Exception("Bad Integer in " + "[" + line + "]. " + ex.getMessage());
            }
        }
        return ans;
    }

    // Integer[] の内容を表示する。
    private static void show_array(Integer[] array, String message) {
        System.out.print(message + "[");
        StringBuilder sb = new StringBuilder();
        for (Integer val : array) {
            if (sb.length() > 0) {
                sb.append(", ");
            }
            sb.append(val);
        }
        System.out.println(sb + "]");
    }
次のテキストファイルを用意しました。
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/13 12:20

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

こんにちは。

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

23 33 43

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

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Q16077 {

    // 読み込むテキストファイル名
    private static final String INPUT_FILE = "inputs.txt";
    
    public static void main(String[] args) throws IOException {
        
        // 読み込んだ内容を保持するためのリスト
        List<Integer []> resultsList = new ArrayList<Integer []>();
        
        // 入力ストリームを開く
        BufferedReader br = new BufferedReader(new FileReader(INPUT_FILE));
        
        // 各行を読み込むための文字列初期化
        String line = null;
        
        // 各行を読むループ
        while ( (line = br.readLine()) != null ) {
            // 各行の整数を保持するためのリスト初期化
            List<Integer> integersList = new ArrayList<Integer>();
            
            // 読み込んだ行を、スペースで区切ってトークナイザを作成
            StringTokenizer tknzr = new StringTokenizer(line, " ");
            
            // 各トークンについて整数変換を試み、変換できればリストに追加
            while ( tknzr.hasMoreElements() ) {
                String s = tknzr.nextToken();
                try {
                    integersList.add(Integer.parseInt(s));
                } catch (NumberFormatException e) {
                    System.err.println("整数に変換できない文字列:" + s);
                }
            }
            
            // 整数のリストを配列に変換して、読み込み結果を保持するリストに追加
            Integer [] integersArray = integersList.toArray( new Integer[] {});
            resultsList.add(integersArray);
        }
        
        // 入力ストリームを閉じる
        br.close();

        // 結果の表示
        printResults(resultsList);
    }

    // 結果を表示するメソッド
    private static void printResults(List<Integer []> resultsList)
    {
        final int numLines = resultsList.size();
        
        for ( int i = 0; i < numLines; ++ i  ) {
            System.out.print( (i+1) + "行目:");
            Integer[] a = resultsList.get(i); 
            for ( int j = 0; j < a.length; ++ j) {
                System.out.print( (j > 0 ? " ":"") + a[j]);
            }
            System.out.println();
        }
    }
}
上記のコードで、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/13 12:22

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

    キャンセル

0

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

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


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

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

Java7以上で使えるパターンを書いておきます。
// import java.util.*; // Iterator, Scanner

// コンストラクター Scanner(File) は throws FileNotFoundException
try (Scanner scanner = new Scanner(new File("ファイル名"))) {
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        // ...
    }
}


②1行をString配列にする

lineとして読み込んだ1行を半角スペースで分割するには、
String line = ...;
String[] stringArray = line.split(" ");
とするのが手っ取り早いです。
Scanner.nextIntを使う手もありますが、配列に変換するのが面倒なので。


String配列をint配列にする。

いろいろやり方はありますが、どのようなケースでも対応できるようにシンプルに行きましょう。
String[] stringArray = ...;
int n = stringArray.length;
int[] intArray = new int[n];
for (int i = 0; i < n; i++) {
    try {
        intArray[i] = Integer.parseInt(stringArray[i]);
    } catch (NumberFormatException e) {
        // 文字列がintに変換できる形式でなかった場合
    }
}


(追記)

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

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.*;

public final class App {

    public static void main(String[] args) {
        try (Stream<String> lines = Files.lines(Paths.get("input.txt"))) {
            lines.forEach(x -> {
                int[] intArray = Stream.of(x.split(" ")).mapToInt(Integer::parseInt).toArray();
                System.out.println("int array=" + Arrays.toString(intArray));
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/09/11 22:39

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

    キャンセル

  • 2015/09/13 12:22

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

    キャンセル

  • 2015/09/13 12:33

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

    キャンセル

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 20:29

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

    キャンセル

  • 2015/09/13 12:21

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

    キャンセル

0

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

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class ReadInt {
    public static void main(String[] args) {
        try {
            do_action(args[0], 3);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void do_action(final String filename, final int num_array) throws IOException, Exception {
        // ファイルの 1 行を int[] に変換して List に保存する。
        List<int[]> lists = new ArrayList<int[]>();
        try {
            Files.lines(Paths.get(filename)).forEach(line -> {
                int[] ints = null;
                try {
                    ints = Stream.of(line.split(" ")).mapToInt(Integer::parseInt).toArray();
                    if (ints.length != num_array) {
                        throw new RuntimeException("Bad line: '" + line + "'");
                    }
                } catch (Exception ex) {
                    throw new RuntimeException(ex); // 非検査例外でラップ
                }
                lists.add(ints);
            });
        } catch (RuntimeException re) {
            Throwable ex = re.getCause(); // 元の例外を取り出す
            throw new Exception(ex);
        }

        // lists を Integer[num_array][] に変換する
        final int num = lists.size();
        Integer[][] i_arrays = new Integer[num_array][num];
        for (int idx = 0; idx < num; idx++) {
            int[] ints = lists.get(idx);
            for (int i = 0; i < 3; i++) {
                i_arrays[i][idx] = ints[i];
            }
        }

        // Integer[] の内容を表示する
        for (Integer[] ary : i_arrays) {
            System.out.println("Integer[] = " + Arrays.toString(ary));
        }
    }
}
実行例
Integer[] = [2, 34, 324, 23]
Integer[] = [34, 23, 4325, 33]
Integer[] = [343, 532, 543, 43]

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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