配列を使うとどうしても配列の要素数を先に決めなければなりません。これをしなくてもいいのがリストです。配列に比べ、data[8]などのインデックスを指定してのアクセスはdata.get(8)などと代わりますが、このような作業は苦手です。多少時間がかかるようになります。
下記の例ではプログラムの内容はOOkiiJun41.javaと少し異なりますが、配列の代わりにリストを使った部分の色を変えてあります。
それほど違わないということがわかると思います。
import java.io.*; import java.util.*; public class OokiiJun51 { String jnum ; int ten1 ; int ten2 ; int ten3 ; int soukei ; public OokiiJun51( String line, String sep) { String[] tmp = line.split(sep); jnum = tmp[0]; ten1 = Integer.parseInt(tmp[1]); ten2 = Integer.parseInt(tmp[2]); ten3 = Integer.parseInt(tmp[3]); soukei = ten1 + ten2 + ten3; } public String toString() { return jnum+" "+ten1+" "+ten2+" "+ten3+" "+soukei; } public static void main( String[] args ) { String sep = "\t"; String fname = "data51.txt"; LinkedList<OokiiJun51> jlist = new LinkedList<OokiiJun51>(); try { FileReader in = new FileReader(fname); BufferedReader inb = new BufferedReader(in); String line; while ((line = inb.readLine()) != null) { jlist.add( new OokiiJun51(line,sep)); } inb.close(); in.close(); } catch (IOException e) { System.err.println( fname + " がないのでは?" ); System.err.println( e); } //sort Collections.sort(jlist,new SoukeiComp()); int ct = jlist.size(); for (int i = 1; i < ct ; i++) { System.out.println(jlist.get(i)); } } } class SoukeiComp implements Comparator<OokiiJun51>{ public int compare(OokiiJun51 x, OokiiJun51 y) { return y.soukei - x.soukei; } }
toString() メソッドを使っていますが、print()メソッドと同様な目的です。本質とは関係ありません。このようにもできるということです。toString() があると、System.out.println()の中で、jlist.get(i).toString() と書くべき所を、jlist.get(i) と省略できるというだけのことです。
データはこのプログラムだけ別なものを使います。
このデータはもともと12行のデータです。下記をコピーして作りなさい。データの区切りはタブです。これをスペースにしてはいけません。
n101 65 67 52 n102 35 39 38 n103 57 78 40 n104 45 57 59 n105 45 58 50 n106 52 86 61 n107 63 72 65 n108 44 50 52 n109 58 79 38 n110 63 42 55 n111 55 80 40 n112 52 81 65
ソートした結果はこのようになります。
n106 52 86 61 199 n112 52 81 65 198 n101 65 67 52 184 n103 57 78 40 175 n109 58 79 38 175 n111 55 80 40 175 n104 45 57 59 161 n110 63 42 55 160 n105 45 58 50 153 n108 44 50 52 146 n102 35 39 38 112
OokiiJun51.java では全部の表示に普通のforを使っています。jlist.size() や jlist.get(i) を紹介したいからですが、for each を使えばもっと簡単です。
int ct = jlist.size(); for (int i = 1; i < ct ; i++) { System.out.println(jlist.get(i)); }
for each (java ではforeachと書かず、forだけです)を使えば次のように書けます。
for ( OokiiJun51 one : jlist ){ System.out.println( one ); }
jlist の要素を OokiiJun51 のインスタンス one にひとつずつ入れて、jlist の要素数だけ繰り返すというものです。
上記プログラムを確認しなさい。
OokiiJun42.java の配列を使っている部分を、LinkedListを使うように書き改めなさい
まず、OokiiJun42.java をコピーしてOokiiJun52.java とし、プログラム中の OokiiJun42 をすべて OokiiJun52 にします。
上記を参考にしながら、LinkedList を使うように書き換えます。
使い方と結果は OokiiJun42.java と同じです。