配列を使わないやり方

LinkedListを使って

配列を使うとどうしても配列の要素数を先に決めなければなりません。これをしなくてもいいのがリストです。配列に比べ、data[8]などのインデックスを指定してのアクセスはdata.get(8)などと代わりますが、このような作業は苦手です。多少時間がかかるようになります。

下記の例ではプログラムの内容はOOkiiJun41.javaと少し異なりますが、配列の代わりにリストを使った部分の色を変えてあります。

それほど違わないということがわかると思います。

プログラム名 OokiiJun51.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) と省略できるというだけのことです。

データはこのプログラムだけ別なものを使います。

データ data51.txt

このデータはもともと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

LinkedListの全行表示

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 の要素数だけ繰り返すというものです。

課題

1.

プログラム名 OokiiJun51.java

上記プログラムを確認しなさい。

2.

プログラム名 OokiiJun52.java

OokiiJun42.java の配列を使っている部分を、LinkedListを使うように書き改めなさい

まず、OokiiJun42.java をコピーしてOokiiJun52.java とし、プログラム中の OokiiJun42 をすべて OokiiJun52 にします。

上記を参考にしながら、LinkedList を使うように書き換えます。

使い方と結果は OokiiJun42.java と同じです。

もくじ

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