LoginSignup
3
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-01

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
3
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
8