解答例 - j2.lesson01_2.ExamRecordAction6

package j2.lesson01_2;

public class ExamRecordAction6 {
    public static void main(String[] args) {
        ExamRecord[] rec = new ExamRecord[4];

        rec[0= createExamRecord("Taro"5090100);
        rec[1= createExamRecord("Hanako"703080);
        rec[2= createExamRecord("Kenji"605070);
        rec[3= createExamRecord("Aya"4010090);
        showExamRecords(rec);
        
        System.out.println("===数学の点数順に並べると===");
        ExamRecord[] sortedByMath = sortByMath(rec);
        showExamRecords(sortedByMath);
        
        System.out.println("===3科目平均点の順に並べると===");
        ExamRecord[] sortedByAverage = sortByAverage(rec);
        showExamRecords(sortedByAverage);
        
        System.out.println("===ソート前の順の確認===");
        showExamRecords(rec);    
    }

    public static ExamRecord createExamRecord(String name,
            int math, int japanese, int english) {
        ExamRecord r = new ExamRecord();
        r.name = name;
        r.math = math;
        r.japanese = japanese;
        r.english = english;
        return r;
    }

    public static void showExamRecord(ExamRecord r) {
        System.out.println(r.name + ", 数学 = " + r.math
                ", 国語 = " + r.japanese
                ", 英語 = " + r.english
                ", 3科目の平均 = "
                ((r.math + r.japanese + r.english3.0));
    }
    
    public static void showExamRecords(ExamRecord[] ra){
        for(int i=0; i<ra.length; i++){
            showExamRecord(ra[i]);
        }
    }
    
    public static double averageMath(ExamRecord[] ra){
        int sum = 0;
        for(int i=0; i<ra.length; i++){
            sum += ra[i].math;
        }
        return (double)sum / ra.length;
    }
    
    public static double averageJapanese(ExamRecord[] ra){
        int sum = 0;
        for(int i=0; i<ra.length; i++){
            sum += ra[i].japanese;
        }
        return (double)sum / ra.length;
    }
    
    public static double averageEnglish(ExamRecord[] ra){
        int sum = 0;
        for(int i=0; i<ra.length; i++){
            sum += ra[i].english;
        }
        return (double)sum / ra.length;
    }
    
    public static double getAverage(ExamRecord r){
        return (r.math + r.japanese + r.english)/3.0;
    }
    
    public static ExamRecord[] sortByMath(ExamRecord[] ra){
        // 引数で渡された配列と別の配列を用意する
        ExamRecord[] result = new ExamRecord[ra.length];
        
        // raからresultへ1レコードずつコピーして行く
        // コピー済みの記録が必要
        boolean[] copied = new boolean[ra.length];
        for(int i=0; i<copied.length; i++)
            copied[ifalse;

        for(int i=0; i<result.length; i++){
            // 未コピーのデータで最大のものを探す
            int maxValue = -1;
            int index = -1;

            for(int j=0; j<ra.length; j++){
                if(!copied[j&& ra[j].math > maxValue){
                    maxValue = ra[j].math;
                    index = j;
                }
            }    

            // indexは未コピーのデータの中で最大のものを指す
            result[i]=ra[index];
            copied[index]=true;
        }
        return result;
    }
    
    public static ExamRecord[] sortByAverage(ExamRecord[] ra){
        // 引数で渡された配列と別の配列を用意する
        ExamRecord[] result = new ExamRecord[ra.length];
        
        // raからresultへ1レコードずつコピーして行く
        // コピー済みの記録が必要
        boolean[] copied = new boolean[ra.length];
        for(int i=0; i<copied.length; i++)
            copied[ifalse;

        for(int i=0; i<result.length; i++){
            // 未コピーのデータで最大のものを探す
            double maxValue = -1;
            int index = -1;

            for(int j=0; j<ra.length; j++){
                if(!copied[j&& getAverage(ra[j]) > maxValue){
                    maxValue = getAverage(ra[j]);
                    index = j;
                }
            }    

            // indexは未コピーのデータの中で最大のものを指す
            result[i]=ra[index];
            copied[index]=true;
        }
        return result;
    }
}