質問者の依頼を受けてコメント書きました。
俺にはこれ以上親切には書けません。
//================================================== // Score.java //================================================== import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; public class Score { // 成績格納用リスト // 生徒1人の情報(学籍番号、各科目の得点)をArrayListにし、 // それをこのリストの1件とする。 private ArrayList allList = new ArrayList(); // 全生徒の「国語」の総得点 private int allLang = 0; // 全生徒の「数学」の総得点 private int allMath = 0; // 全生徒の「英語」の総得点 private int allEngl = 0; /** 科目「国語」を表現するキーです。 */ public static final String KEY_KOKUGO = "0"; /** 科目「数学」を表現するキーです。 */ public static final String KEY_SUGAKU = "1"; /** 科目「英語」を表現するキーです。 */ public static final String KEY_EIGO = "2"; public static void main(String[] args) { Score self = new Score(); // どっちを実行してるか分からなくなるのでデバッグ用にクラス名出力 System.out.println( self.getClass().getName() ); // キー入力を元に成績をリストに格納。 self.read_student(); // リストを出力。合計点、平均点も出力。 self.print_student(); } /** * <PRE> * 以下の形式のキー入力を読み取り、成績をリストに格納します。 * [形式] * 学籍番号 国語 数学 英語 * または * 学籍番号 国語 数学 英語 理科 社会 * 上記はすべて整数であると仮定しています。 * * "exit" というキー入力があれば読み取りを終了します。 * </PRE> */ public void read_student() { BufferedReader br; String line; try { br = new BufferedReader(new InputStreamReader(System.in)); System.out.println( "学籍番号と各科目の得点を入力してください。" ); System.out.println( "exitで抜けます。\n" ); System.out.print("input > "); // System.inによるキー入力を読み取る。exitなら読み取り終了。 while (!(line = br.readLine()).equals("exit")) { // 読み取った値をtokenに分解。 StringTokenizer token = new StringTokenizer(line); // tokenがまだある間、 while (token.hasMoreTokens()) { // tokenを成績リストに格納。 addTokenToList(token); } // 読み取り続行。 System.out.print("input > "); } } catch (IOException ioe) { ioe.printStackTrace(); } catch( NumberFormatException nfe ) { nfe.printStackTrace(); } } /** * <PRE> * キー入力された生徒1人分の情報(StringTokenizer)をリストに格納します。 * </PRE> * * @param token StringTokenizer 入力された生徒1人分の情報 */ public void addTokenToList(StringTokenizer token) throws NumberFormatException { // 生徒1人分の成績を格納するリスト作成。要素数は4にしておく。 // 5科目の時は格納時に要素数が自動的に広がる。 ArrayList oneList = new ArrayList(4); // tokenがまだある間、 while(token.hasMoreTokens()) { // 生徒1人分の成績を格納するリストにtokenの情報を格納。 // 学籍番号も整数としている。 oneList.add( Integer.valueOf(token.nextToken()) ); } // 成績リストに生徒1人分の情報を格納。 allList.add(oneList); // GC促進。 oneList = null; } /** * <PRE> * 入力された全ての生徒の成績(学籍番号、国語、数学、英語、3科目の合計) * および各科目(国語、数学、英語、3科目合計)の平均点を出力します。 * </PRE> */ public void print_student() { System.out.println( "学番\t国語\t数学\t英語\t合計" ); System.out.println( "------------------------------------" ); // 成績出力ロジックの科目数に依存しない部分 print_student_loop(); // 成績格納用リストの要素数(=生徒数)取得。 int count = allList.size(); System.out.println( "------------------------------------" ); // 全生徒全科目の総得点を計算。 int allSum = allLang + allMath + allEngl; // 平均点出力。 System.out.println( "平均\t" + Math.round(allLang*10.0 / count)/10.0 + "\t" + Math.round(allMath*10.0/count)/10.0 + "\t" + Math.round(allEngl*10.0/count)/10.0 + "\t" + Math.round(allSum*10.0/count)/10.0 ); } /** * <PRE> * 成績出力ロジックのうち * 科目数に依存しない部分を外出し。 * </PRE> * */ protected void print_student_loop() { // 成績格納用リストからIterator取得。 Iterator allIterator = allList.iterator(); // 生徒の数でループ while(allIterator.hasNext()) { // 生徒1人分の成績情報を取得。 ArrayList oneList = (ArrayList)allIterator.next(); // 生徒1人分の成績用リストからIterator取得。 Iterator oneIterator = oneList.iterator(); // 学籍番号取得。 int studentID = ((Integer)oneIterator.next()).intValue(); // 学籍番号出力。 System.out.print( studentID + "\t" ); // 科目を識別するキー int key=0; // 科目数でループ while( oneIterator.hasNext() ) { // ある科目の得点を取得。 int value = ((Integer)oneIterator.next()).intValue(); // 全生徒のある科目の総得点を計算。 // 科目はキーで識別する。 add_student_to_sum( String.valueOf(key++), value ); // ある科目の得点を出力。 System.out.print( value + "\t" ); } // 生徒1人の各科目の合計点を出力。 // 合計点の計算はメソッド呼び出し。 System.out.print( calc_total_of_student(oneList) + "\t" ); // 改行。 System.out.println(); } } /** * <PRE> * 生徒1人分の成績情報を元に、生徒1人の全科目の合計点を出力します。 * </PRE> * @param onelist ArrayList 生徒1人分の成績情報リスト(学籍番号、各科目の得点) * @param 生徒1人の全科目の合計点 */ public int calc_total_of_student(ArrayList oneList) { // 生徒1人分の成績用リストからIterator取得 Iterator oneIterator = oneList.iterator(); // 生徒1人の各科目の合計点。 int sum = 0; // 生徒1人分の成績用リストから学籍番号取得。 int studentID = ((Integer)oneIterator.next()).intValue(); while( oneIterator.hasNext() ) { // 各科目の得点の総和で合計点を計算。 sum += ((Integer)oneIterator.next()).intValue(); } return sum; } /** * <PRE> * 全ての生徒の各科目の総得点を計算します。 * @param key 科目を識別するキー * @param score 得点 * </PRE> */ public void add_student_to_sum(String key, int score) { // 国語 if( key.equals(KEY_KOKUGO) ) { // 全生徒の「国語」の総得点にプラス allLang += score; // 数学 } else if( key.equals(KEY_SUGAKU) ) { // 全生徒の「数学」の総得点にプラス allMath += score; // 英語 } else if( key.equals(KEY_EIGO) ) { // 全生徒の「英語」の総得点にプラス allEngl += score; } } public ArrayList getAllList() { return allList; } public int getAllEngl() { return allEngl; } public int getAllLang() { return allLang; } public int getAllMath() { return allMath; } }
//================================================== // ScoreEx.java //================================================== public class ScoreEx extends Score { // 全生徒の「理科」の総得点 private int allScie = 0; // 全生徒の「社会」の総得点 private int allSoci = 0; /** 科目「理科」を表現するキーです。 */ public static final String KEY_RIKA = "3"; /** 科目「社会」を表現するキーです。 */ public static final String KEY_SYAKAI = "4"; public static void main(String[] args) { ScoreEx self = new ScoreEx(); // どっちを実行してるか分からなくなるのでデバッグ用にクラス名出力 System.out.println( self.getClass().getName() ); // read_student()はスーパークラスに委譲。 self.read_student(); // print_student()は科目数に依存するところのみを実装。他は委譲(super.print_student_loop())。 self.print_student(); } /** * <PRE> * 入力された全ての生徒の成績(学籍番号、国語、数学、英語、3科目の合計) * および各科目(国語、数学、英語、3科目合計)の平均点を出力します。 * </PRE> */ public void print_student() { System.out.println( "学番\t国語\t数学\t英語\t理科\t社会\t合計" ); System.out.println( "-----------------------------------------------------" ); // 成績出力ロジックの科目数に依存しない部分をコール super.print_student_loop(); // 成績格納用リストの要素数(=生徒数)取得。 int count = getAllList().size(); System.out.println( "-----------------------------------------------------" ); // 全生徒全科目の総得点を計算。 int allSum = getAllLang() + getAllMath() + getAllEngl() + getAllScie() + getAllSoci(); // 平均点出力。 System.out.println( "平均\t" + Math.round(getAllLang()*10.0 / count)/10.0 + "\t" + Math.round(getAllMath()*10.0/count)/10.0 + "\t" + Math.round(getAllEngl()*10.0/count)/10.0 + "\t" + Math.round(getAllScie()*10.0/count)/10.0 + "\t" + Math.round(getAllSoci()*10.0/count)/10.0 + "\t" + Math.round(allSum*10.0/count)/10.0 ); } /** * <PRE> * 各科目の総得点を計算します。 * @param key 科目を識別するキー * @param score 得点 * </PRE> */ public void add_student_to_sum(String key, int score) { // 「国語」「数学」「英語」はスーパークラスに委譲。 super.add_student_to_sum(key, score); // 理科 if( key.equals(KEY_RIKA) ) { // 全生徒の「理科」の総得点にプラス allScie += score; // 社会 } else if( key.equals(KEY_SYAKAI) ) { // 全生徒の「社会」の総得点にプラス allSoci += score; } } public int getAllScie() { return allScie; } public int getAllSoci() { return allSoci; } }
// ================================================== // ScoreFile.java //================================================== import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; public class ScoreFile { // ScoreFile has a ScoreにしておいてScoreクラスに処理を委譲する。 Score score = new Score(); // メッセージ出力用バッファ StringBuffer messageBuffer = new StringBuffer(); public static void main(String[] args) { // コマンドライン引数チェック if (args.length != 2) { System.out.println("使い方:java ScoreFile 入力ファイル名 出力ファイル名"); System.exit(1); } ScoreFile self = new ScoreFile(); // どっちを実行してるか分からなくなるのでデバッグ用にクラス名出力 System.out.println( self.getClass().getName() ); try { // 入力ファイル読み込み self.readFile(args[0]); // 合計点、平均点を付加したメッセージ作成。 self.createInfo_student(); // 出力ファイル書き込み self.writeFile(args[1]); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * <PRE> * 入力ファイルを読み取って成績用リストに格納します。 * <PRE> * @param fileName 入力ファイル * @throws IOException 入力失敗時に発生。 */ void readFile(String fileName) throws IOException { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line; // 入力ファイルを1行づつ読み取る while ((line = br.readLine()) != null) { // tokenに分解 StringTokenizer token = new StringTokenizer(line); // tokenがまだある間、 while (token.hasMoreTokens()) { // tokenを成績リストに格納。 score.addTokenToList(token); } } // ファイル入力完了時にコンソールに出力される。 System.out.println( "ファイル入力完了 ... " + fileName ); } /** * <PRE> * 入力された全ての生徒の成績(学籍番号、国語、数学、英語、3科目の合計) * および各科目(国語、数学、英語、3科目合計)の平均点を計算し、 * メッセージ出力用バッファに格納します。 * </PRE> */ private void createInfo_student() { messageBuffer.append( "学番\t国語\t数学\t英語\t合計\n" ); messageBuffer.append( "------------------------------------\n" ); // 成績格納用リストからIterator取得。 Iterator allIterator = score.getAllList().iterator(); // 生徒の数でループ while(allIterator.hasNext()) { // 生徒1人分の成績情報を取得。 ArrayList oneList = (ArrayList)allIterator.next(); // 生徒1人分の成績用リストからIterator取得。 Iterator oneIterator = oneList.iterator(); // 学籍番号取得。 int studentID = ((Integer)oneIterator.next()).intValue(); // 学籍番号出力。 messageBuffer.append( studentID + "\t" ); // 科目を識別するキー int key=0; // 科目数でループ while( oneIterator.hasNext() ) { // ある科目の得点を取得。 int value = ((Integer)oneIterator.next()).intValue(); // 全生徒のある科目の総得点を計算。 // 科目はキーで識別する。 score.add_student_to_sum( String.valueOf(key++), value ); // ある科目の得点を出力。 messageBuffer.append( value + "\t" ); } // 生徒1人の各科目の合計点を出力。 // 合計点の計算はメソッド呼び出し。 messageBuffer.append( score.calc_total_of_student(oneList) + "\n" ); } // 成績格納用リストの要素数(=生徒数)取得。 int count = score.getAllList().size(); messageBuffer.append( "------------------------------------\n" ); // 全生徒全科目の総得点を計算。 int allSum = score.getAllLang() + score.getAllMath() + score.getAllEngl(); // 平均点出力。 messageBuffer.append( "平均\t" + Math.round(score.getAllLang()*10.0 / count)/10.0 + "\t" + Math.round(score.getAllMath()*10.0/count)/10.0 + "\t" + Math.round(score.getAllEngl()*10.0/count)/10.0 + "\t" + Math.round(allSum*10.0/count)/10.0 + "\n" ); } /** * <PRE> * メッセージを出力ファイルに書き出します。 * </PRE> * @param fileName 出力ファイル名 * @throws IOException 出力例外時に発生。 */ void writeFile(String fileName) throws IOException { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(fileName)); // 出力ファイルにメッセージ出力用バッファを書き出す。 bw.write(messageBuffer.toString()); // ファイル出力完了時にコンソールに出力される。 System.out.println( "ファイル出力完了 ... " + fileName ); } catch (IOException ioe) { ioe.printStackTrace(); } finally { if( bw != null ) bw.close(); } } }
// ================================================== // ScoreExFile.java //================================================== import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; public class ScoreExFile { // ScoreExFile has a ScoreExにしておいてScoreExクラスに処理を委譲できるようにする。 ScoreEx scoreEx = new ScoreEx(); // メッセージ出力用バッファ StringBuffer messageBufferEx = new StringBuffer(); public static void main(String[] args) { // コマンドライン引数チェック if (args.length != 2) { System.out.println("使い方:java ScoreExFile 入力ファイル名 出力ファイル名"); System.exit(1); } ScoreExFile self = new ScoreExFile(); // どっちを実行してるか分からなくなるのでデバッグ用にクラス名出力 System.out.println( self.getClass().getName() ); try { // 入力ファイル読み込み self.readFile(args[0]); // 合計点、平均点を付加したメッセージ作成。 self.createInfo_student(); // 出力ファイル書き込み self.writeFile(args[1]); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * <PRE> * 入力ファイルを読み取って成績用リストに格納します。 * <PRE> * @param fileName 入力ファイル * @throws IOException 入力失敗時に発生。 */ private void readFile(String fileName) throws IOException { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line; // 入力ファイルを1行づつ読み取る while ((line = br.readLine()) != null) { // tokenに分解 StringTokenizer token = new StringTokenizer(line); // tokenがまだある間、 while (token.hasMoreTokens()) { // tokenを成績リストに格納。 scoreEx.addTokenToList(token); } } // ファイル入力完了時にコンソールに出力される。 System.out.println( "ファイル入力完了 ... " + fileName ); } /** * <PRE> * 入力された全ての生徒の成績(学籍番号、国語、数学、英語、3科目の合計) * および各科目(国語、数学、英語、3科目合計)の平均点を出力します。 * </PRE> */ private void createInfo_student() { messageBufferEx.append( "学番\t国語\t数学\t英語\t理科\t社会\t合計\n" ); messageBufferEx.append( "-----------------------------------------------------\n" ); // 成績格納用リストからIterator取得。 Iterator allIterator = scoreEx.getAllList().iterator(); // 生徒の数でループ while(allIterator.hasNext()) { // 生徒1人分の成績情報を取得。 ArrayList oneList = (ArrayList)allIterator.next(); // 生徒1人分の成績用リストからIterator取得。 Iterator oneIterator = oneList.iterator(); // 学籍番号取得。 int studentID = ((Integer)oneIterator.next()).intValue(); // 学籍番号出力。 messageBufferEx.append( studentID + "\t" ); // 科目を識別するキー int key=0; // 科目数でループ while( oneIterator.hasNext() ) { // ある科目の得点を取得。 int value = ((Integer)oneIterator.next()).intValue(); // 全生徒のある科目の総得点を計算。 // 科目はキーで識別する。 scoreEx.add_student_to_sum( String.valueOf(key++), value ); // ある科目の得点を出力。 messageBufferEx.append( value + "\t" ); } // 生徒1人の各科目の合計点を出力。 // 合計点の計算はメソッド呼び出し。 messageBufferEx.append( scoreEx.calc_total_of_student(oneList) + "\n" ); } // 成績格納用リストの要素数(=生徒数)取得。 int count = scoreEx.getAllList().size(); messageBufferEx.append( "-----------------------------------------------------\n" ); // 全生徒全科目の総得点を計算。 int allSum = scoreEx.getAllLang() + scoreEx.getAllMath() + scoreEx.getAllEngl() + scoreEx.getAllScie() + scoreEx.getAllSoci(); // 平均点出力。 messageBufferEx.append( "平均\t" + Math.round(scoreEx.getAllLang()*10.0 / count)/10.0 + "\t" + Math.round(scoreEx.getAllMath()*10.0/count)/10.0 + "\t" + Math.round(scoreEx.getAllEngl()*10.0/count)/10.0 + "\t" + Math.round(scoreEx.getAllScie()*10.0/count)/10.0 + "\t" + Math.round(scoreEx.getAllSoci()*10.0/count)/10.0 + "\t" + Math.round(allSum*10.0/count)/10.0 + "\n" ); } /** * <PRE> * メッセージを出力ファイルに書き出します。 * </PRE> * @param fileName 出力ファイル名 * @throws IOException 出力例外時に発生。 */ private void writeFile(String fileName) throws IOException { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(fileName)); // 出力ファイルにメッセージ出力用バッファを書き出す。 bw.write(messageBufferEx.toString()); // ファイル出力完了時にコンソールに出力される。 System.out.println( "ファイル出力完了 ... " + fileName ); } catch (IOException ioe) { ioe.printStackTrace(); } finally { if( bw != null ) bw.close(); } } }