ページ 11

JAVAのファイル→配列について

Posted: 2012年12月15日(土) 13:28
by fuku
以下のような「test.txt」というファイルがあるとします。

父 44歳 182.0 76.4 
母 46歳 159.0 42.5 134.4
拓哉 13歳 161.9 54.5 444.3 32.6 22.2 
愛 7歳 110.6 31.4
おじさん 77歳 170.4 65.5 25.3

ファイルは追加される(おじさんの下におばあさんのような感じ)ことがあります。
これを{父, 母, 拓哉, 愛, おじさん}の配列、{44, 46, 13, 7, 77}の配列、年齢の後ろにあるデータ(人によって長さはバラバラ)を「父の塊、母の塊、拓哉の塊、愛の塊、おじさんの塊」というふうに配列と構造体?(データの部分)にしたいです。
そして、年齢順にソートして、最後に表示するプログラムにしたいです。

つまり、ファイル内のデータを読み込み、1列目の配列、2列目の配列、それ以降の塊という感じで配列としてまとめたいです。
そして、並び替えると

愛 7歳 110.6 31.4
拓哉 13歳 161.9 54.5 444.3 32.6 22.2
父 44歳 182.0 76.4 
母 46歳 159.0 42.5 134.4
おじさん 77歳 170.4 65.5 25.3

となるようにしたいですが、考え方がイマイチピンとこないので教えて下さい。
ArrayListを使うのでしょうか?それとも、1列目、2列目とファイル内で指定してから読み込ませることができるのでしょうか?
JAVA初心者なので詳しくお願いします。

mac/java/javac

Re: JAVAのファイル→配列について

Posted: 2012年12月16日(日) 02:47
by かずま
名前だけの配列、年齢だけの配列というデータ構造は、ソートには向かないと思います。
1行の入力データを、1つのクラスにして、それを配列にするほうがよいでしょう。

完成品のプログラムを書くのは教育上よろしくないそうなので、
一部、日本語で書きました。

コード:

import java.io.*;
import java.util.*;

class Entry {
    String name;
    int age;
    float[] values;

    Entry(String s) {
        String[] fld = s.split("[\t ]+");
        name = fld[0];
        age = Integer.parseInt(fld[1].substring(0, fld[1].length()-1));
        int n = fld.length - 2;
        values = new float[n];
        for (int i = 0; i < n; i++) values[i] = Float.parseFloat(fld[2+i]);
    }

    void print() {
        name と age + "歳" を表示;
        values の値をすべて表示;
        改行;
    }
}
    
class Main {
    public static void main(String[] args) throws IOException {
        入力情報 Entry の配列(ArrayList)オブジェクト entries を構築;
        ファイル "test.txt" のバッファリング読み取りオブジェクト br を構築;
        while (true) {
            brオブジェクトの readLineメソッドで 文字列 line に 1行入力;
            if (入力がなければ) break;
            line から Entry オブジェクト entry を構築;
            配列 entries に entry を追加;
        }
        年齢 age で比較(compare)する 比較オブジェクト(Comparator)を構築し、
        Collectionsクラスの sortメソッドで entries をソートする;
        entries の内容をすべて Entry の printメソッドで表示する。
    }
}
例えば、

コード:

        年齢 age で比較(compare)する 比較オブジェクト(Comparator)を構築し、
        Collectionsクラスの sortメソッドで entries を sort する;
のところは

コード:

        Collections.sort(entries, new Comparator<Entry>() {
            public int compare(Entry a, Entry b) { return a.age - b.age; }
        });
のように書き換えれば、プログラムが完成に近づきます。
分からないところはどこですか?

なお、入力データの項目の区切りは全角文字の空白にしていません。

Re: JAVAのファイル→配列について

Posted: 2012年12月20日(木) 01:16
by fuku
ありがとうございます。このプログラムを参考に動かすことができました。また、これで完成ではないのでもっと努力してJAVAをマスターしたいと思います。