1、『生徒名、科目名・点数』という情報を、2次元マップのデータ構造にしました。
2、それぞれの生徒の合計点と平均点をfor文を使って出力しました。
コレクションクラスはインスタンスでないものは格納できない。
しかし、int型の情報をInteger型(ラッパークラス)にすれば格納できる。
Eclipse Oxygenで実行
2次元マップを作って回すプログラム
import java.util.LinkedHashMap;
import java.util.Map;
public class MapScore {
public static void main(String[] args) {
//2次元マップをつくる
//マップ名の直前、つまり Map<String, Map<String, Integer>>までがデータ型
Map<String, Map<String, Integer>> nameMap = new LinkedHashMap<String, Map<String, Integer>>();
//鈴木さん
Map<String, Integer> scoresMap_suzuki = new LinkedHashMap<String, Integer>();
scoresMap_suzuki.put("国語", 78);
scoresMap_suzuki.put("数学", 90);
scoresMap_suzuki.put("英語", 20);
//佐藤さん
Map<String, Integer> scoresMap_satoh = new LinkedHashMap<String, Integer>();
scoresMap_satoh.put("国語", 50);
scoresMap_satoh.put("数学", 40);
scoresMap_satoh.put("英語", 90);
//田中さん
Map<String, Integer> scoresMap_tanaka = new LinkedHashMap<String, Integer>();
scoresMap_tanaka.put("国語", 80);
scoresMap_tanaka.put("数学", 60);
scoresMap_tanaka.put("英語", 85);
//nameマップのvalueに上記3つのマップを入れることで2次元マップを実現
nameMap.put("鈴木", scoresMap_suzuki);
nameMap.put("佐藤", scoresMap_satoh);
nameMap.put("田中", scoresMap_tanaka);
//拡張forで名前マップを回す
//LinkedHashMapの場合、格納順に取り出される
for (Map.Entry<String, Map<String, Integer>> element : nameMap.entrySet()) {
//nameMapのバリューを取得して、新規のマップに代入する
Map<String,Integer> scores = element.getValue();
int sum = 0;
int avg = 0;
//scoresMap_名前のバリュー、つまり点数を回して、sumに代入していく
for(int hogeInt : scores.values()){
sum += hogeInt;
avg = sum / scores.size();
}
//人数分(3人分)出力
System.out.println(element + "合計点は" + sum + " " + "平均は" + avg);
}
}
}
実行結果
実行結果
鈴木={国語=78, 数学=90, 英語=20}合計点は188 平均は62
佐藤={国語=50, 数学=40, 英語=90}合計点は180 平均は60
田中={国語=80, 数学=60, 英語=85}合計点は225 平均は75