Java
初心者

Java 2次元マップに格納してfor文で回す

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