数値だけがデータになっている例はまれで、普通は他のデータが組み合わされています。たとえば、その数値は生徒名と点数だったり、地域と雨量だったり、時間と温度の関係だったりします。その場合、最高点は何点かだけでなく、最高点は誰かも知りたいし、温度が一番高いのは何度かだけでなくいつが一番温度が高いかということも知りたい場合があるでしょう。
データが受験番号と点数の組み合わせであったとします。
n1001 300 n1002 178 n1003 306 n1004 335 n1005 312 n1006 243 n1007 241 ....
data21.txtダウンロード(右クリックで保存する)
受験番号であることをはっきり示すためにnを付けました。データの区切りは最近の流行のタブです。(以前はコンマでした)
このようなデータは1行がひとまとまりのデータなので、1行をレコード、行内の項目をフィールドと呼ぶことがあります。
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++; 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
いちばん大切なのは ndata = line.split(sep); の部分です。lineという文字列をsepをフィールドの区切りとして分けます。その結果は配列になりますので、ndataという配列に代入するというものです。
sepに代入されているのはタブで正確には文字として書けない記号です。k2editorなどでは→と表現されますが、普通はスペースのような空白になります。javaでは "¥t" と表します。
lineの値
n1001→300
ndata = line.split(sep) は次の作業をしたことになります。
ndata[0] = "n1001"; ndata[1] = "300";
両方文字列であることに注意してください。
配列をフィールドの数にあわせます。たとえば4つのフィールドでは
String[] ndata = new String[4];
lineの値
n1001→300→400→500
ndata = line.split(sep) は次の作業をしたことになります。
ndata[0] = "n1001"; ndata[1] = "300"; ndata[2] = "400"; ndata[3] = "500";
おなじデータから最小値を求めて表示するプログラムにしなさい。
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ダウンロード(右クリックで保存する)
最後のデータが合計点です。合計点の一番高い者の受験番号、各科目の点数を次のように表示するプログラムをつくりなさい。
動作結果
$ java Saidai22 データ数1101 最大値:n2026 75 94 84 88 96 437
おなじデータからトップ10を表示するプログラムをつくりなさい。(これは挑戦することに意義がある…?)