複数のフィールドからなるデータ

最大値

数値だけがデータになっている例はまれで、普通は他のデータが組み合わされています。たとえば、その数値は生徒名と点数だったり、地域と雨量だったり、時間と温度の関係だったりします。その場合、最高点は何点かだけでなく、最高点は誰かも知りたいし、温度が一番高いのは何度かだけでなくいつが一番温度が高いかということも知りたい場合があるでしょう。

データが受験番号と点数の組み合わせであったとします。

ファイル名 data21.txt

n1001    300
n1002    178
n1003    306
n1004    335
n1005    312
n1006    243
n1007    241
....

data21.txtダウンロード(右クリックで保存する)

受験番号であることをはっきり示すためにnを付けました。データの区切りは最近の流行のタブです。(以前はコンマでした)

このようなデータは1行がひとまとまりのデータなので、1行をレコード、行内の項目をフィールドと呼ぶことがあります。

プログラム名 Saidai21.java

import java.io.*;

public class Saidai21 {
    public static void main( String[] args ) {
        int ct  = 0;
        int max = 0;
        String[] ndata = new String[2];
        // ndata[0] ... juken bangou
        // ndata[1] ... tensuu
        Srting sep = "\t";
        String junum = "";
        String fname = "data21.txt";
        try {
            FileReader   in  = new FileReader(fname);
            BufferedReader inb = new BufferedReader(in);
            String line;
            while ((line = inb.readLine()) != null) {
                ct++;
                String[] ndata = line.split(sep);
                if( Integer.parseInt(ndata[1]) > max ){
                    max   = Integer.parseInt(ndata[1]);
                    junum = ndata[0];
                }
            }
            inb.close();
            in.close();
        }
        catch (IOException e) {
            System.err.println( fname + " がないのでは?" );
            System.err.println( e);
        }
        System.out.println( "データ数" + ct );
        System.out.println( "最大値:" + junum + " " + max );
    }

}

動作結果

$ java Saidai21
データ数1101
最大値:n2026 437

split()

いちばん大切なのは String[] ndata = line.split(sep); の部分です。lineという文字列をsepをフィールドの区切りとして分けます。その結果は配列になりますので、ndataという配列に代入するというものです。

sepに代入されているのはタブで正確には文字として書けない記号です。エディタによってはではなどと特別な記号で表現されますが、普通はスペースのような空白になります。javaでは "\t" と表します。

lineの値

n1001300

ndata = line.split(sep) は次の作業をしたことになります。

ndata[0] = "n1001";
ndata[1] = "300";

両方文字列であることに注意してください。

フィールドの数が多い場合

lineの値

n1001300400500

String[] ndata = line.split(sep) は次の作業をしたことになります。

フィールドの数にあわせて配列が作られます。

ndata[0] = "n1001";
ndata[1] = "300";
ndata[2] = "400";
ndata[3] = "500";

課題

1.

おなじデータから最小値を求めて表示するプログラムにしなさい。

プログラム名 Saishou21.java

2.

ファイル名 data22.txt

n1001   65   67   56   70   42   300
n1002   35   39   38   32   34   178
n1003   55   80   40   72   59   306
n1004   52   86   61   75   61   335
n1005   63   72   65   53   59   312
n1006   44   50   52   50   47   243
n1007   45   57   59   45   35   241
....

data22.txtダウンロード(右クリックで保存する)

最後のデータが合計点です。合計点の一番高い者の受験番号、各科目の点数を次のように表示するプログラムをつくりなさい。

プログラム名 Saidai22.java

動作結果

$ java Saidai22
データ数1101
最大値:n2026 75 94 84 88 96 437

3.

おなじデータからトップ10を表示するプログラムをつくりなさい。(これは挑戦することに意義がある…?)

プログラム名 Saidai23.java

もくじ

Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Dec.2010
Dec.2011