解答例 - j2.lesson08.ScoreList

package j2.lesson08;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 課題2103 - 解答例.
 * カンマ区切りで記録された学生の得点一覧ファイルを読み出すクラス.
 @author arakawa
 @version $Id: ScoreList_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class ScoreList {

    private final Student[] students;
    
    /**
     * カンマ区切りで記録された学生の得点一覧ファイルの名前を指定してインスタンスを生成する。
     * 得点一覧ファイルはカンマ区切りで順に次のように格納されている。
     <ul>
     <li> 学籍番号 </li>
     <li> 名前 </li>
     <li> 得点 </li>
     </ul>
     @param filename 読み出すファイルの名前
     @throws IOException 得点一覧ファイルを読み込んでいる最中に例外が発生した場合
     @throws NumberFormatException 得点が整数でない場合
     */
    public ScoreList(String filenamethrows IOException {
        super();
        List list = new ArrayList();
        BufferedReader r = new BufferedReader(new FileReader(filename));
        try {
            while (true) {
                String line = r.readLine();
                if (line == null) {
                    break;
                }
                String[] cols = line.split(",");
                list.add(new Student(cols[0], cols[1], Integer.parseInt(cols[2])));
            }
        }
        finally {
            r.close();
        }
        this.students = (Student[]) list.toArray(new Student[list.size()]);
    }

    /**
     * 一覧に含まれる全ての学生を {@link Student} 型を格納している {@link List} で取得する。
     {@link List} 内の順序は、コンストラクタに指定したファイルに記述されている順番に等しい。
     @return 全ての学生を含む {@link List}
     */
    public List getAllStudent() {
        // 外部で変更されたくないのでコピーをとる
        return new ArrayList(Arrays.asList(this.students));
    }
    
    /**
     * 一覧に含まれる学生のうち、<code>grade</code>で指定した成績を持つ学生を取得する。
     * このクラスが返す {@link List} は該当する学生を表す {@link Student} クラスのインスタンスを全て含む。
     {@link List} 内の順序は、コンストラクタに指定したファイルに記述されている順番に等しい。
     @param grade 取得する学生の成績
     @return 指定した成績を持つ学生を含む {@link List} 
     */
    public List getStudents(char grade) {
        Student[] stds = this.students;
        List list = new ArrayList();
        for (int i = 0; i < stds.length; i++) {
            Student student = stds[i];
            if (student.getGrade() == grade) {
                list.add(student);
            }
        }
        return list;
    }
    
    /**
     * サンプルプログラム。
     @param args 無視される
     */
    public static void main(String[] args) {
        ScoreList slist;
        try {
            slist = new ScoreList("U:/ex2103test.txt");
        }
        catch (IOException e) {
            System.out.println("U:/ex2103test.txtが開けません");
            return;
        }
        List all = slist.getAllStudent();
        System.out.println("全体の人数=" + all.size());
        List as = slist.getStudents('A');
        printList('A', as);
        List bs = slist.getStudents('B');
        printList('B', bs);
        List cs = slist.getStudents('C');
        printList('C', cs);
        List ds = slist.getStudents('D');
        printList('D', ds);
    }
    
    private static void printList(char grade, List list) {
        System.out.println(grade + "の学生:");
        for (int i = 0; i < list.size(); i++) {
            System.out.println("  " + list.get(i));
        }
    }
}