魁!dcWORKS塾 〜エンジニア編 vol.7〜

こんにちは! dcWORKSでエンジニアをしているミネです。
弊社のエンジニアチームやデザインチームの実態をより詳しく知ってもらうべく始まった「魁!dcWORKS塾」エンジニア編 第7回をお届けしていきます!

魁!dcWORKS塾とは?

技術研修や勉強会など、それぞれで実際に取り組んでいるような内容を問題・課題の形式でご紹介します。
エンジニアの問題では解答や解決するためのポイントを、またデザインチームでは制作過程など、各チームの取り組みを具体的に紹介していきますのでお楽しみに!
BLOGを見てくださっているみなさんも一緒に楽しみながら取り組んでいただけると嬉しいです。

エンジニア編 第7回ということで、弊社が運営しているプログラミングスクールのEngineersGateでも講師を務めるサトウ先生からの出題です。

人物紹介・サトウ先生
エンジニアズゲート講師。みんなから愛されるキャラクターとボディーの持ち主。

今回は連想配列に関する問題を出題します。
まずは「連想配列」について説明します。

連想配列について

連想配列は、プログラムにおいて、データを格納するための一種のデータ構造です。
プログラム言語によって様々な呼び方があり、ハッシュ(Hash)、マップ(Map)、ディクショナリ(Dictionary)などとも呼ばれます。
連想配列は、データを一意のキー(Key)に関連付けて格納し、そのキーを使用してデータを効率的に取得するために使用されます。
連想配列は通常、キーと値(Value)のペアを格納します。キーは一意で重複しない必要があり、値はキーに関連付けられたデータです。
このようなデータ構造は、データベース、プログラムの設定情報、ディクショナリ、カウンター、キャッシュなど、さまざまな用途で利用されます。
下記はサンプルです。

MainSample.java
package lesson_05.works_02;
import java.util.HashMap;
public class MainSample {
    public static void main(String[] args) {
        // HashMapを生成
        HashMap<String, Integer> ageMap = new HashMap<>();

        // キーと値のペアを追加
        ageMap.put("taro", 30);
        ageMap.put("hanako", 25);
        ageMap.put("jiro", 35);

        // キーを使用して値を取得
        int taroAge = ageMap.get("taro");
        int hanakoAge = ageMap.get("hanako");

        System.out.println("taroの年齢: " + taroAge); // 出力: taroの年齢: 30
        System.out.println("hanakoの年齢: " + hanakoAge); // 出力: hanakoの年齢: 25
    }
}

問題

連想配列に関する下記課題を実装してください。
【課題】
たろう(taro)、はなこ(hanako)、じろう(jiro)は、それぞれフルーツを購入しました。

たろう(taro)
りんご(Apple):5個、バナナ(Banana):1個、オレンジ(Orange):3個

はなこ(hanako)
りんご(Apple):3個、バナナ(Banana):4個、オレンジ(Orange):1個

じろう(jiro)
りんご(Apple):1個、バナナ(Banana):2個、オレンジ(Orange):2個

【課題の要件】
1.たろう、はなこ、じろうの名前(ローマ字名称)をキーとした連想配列を宣言してください。
2.フルーツの名前(アルファベット名)をキーとし、それぞれの人が購入した個数を値とした連想配列を各人に関連付けてください。
3.生成した連想配列を処理して、各フルーツの売れた個数を求めてください。

みなさん、解けましたか?
解答は下記です!

解答例

Main.java

package lesson_05.works_02;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* たろう(taro)、はなこ(hanako)、じろう(jiro)は、それぞれフルーツを購入しました。
*
* たろう(taro):
*    りんご(Apple):5個
*    バナナ(Banana):1個
*    オレンジ(Orange):3個
*
* はなこ(hanako):
*    りんご(Apple):3個
*    バナナ(Banana):4個
*    オレンジ(Orange):1個
*
* じろう(jiro):
*    りんご(Apple):1個
*    バナナ(Banana):2個
*    オレンジ(Orange):2個
*
* 課題の要件:
*    1.たろう、はなこ、じろうの名前(ローマ字名称)をキーとした連想配列を宣言してください。
*    2.フルーツの名前をキーとし、それぞれの人が購入した個数を値とした連想配列を各人に関連付けてください。
*    3.生成した連想配列を処理して、各フルーツの売れた個数を求めてください。
*
* @author tomo-sato
*/
public class Main {
    /**
    * アルファベット名称と、日本語名称のマッピング。
    */
    private static final Map<String, String> IMMUTABLE_FRUITS_MAP;
    static {
        Map<String, String> tempMap = new HashMap<>();
        tempMap.put("Apple", "りんご");
        tempMap.put("Banana", "バナナ");
        tempMap.put("Orange", "オレンジ");

        // ※任意:Collections.unmodifiableMapを使用し、不変なMapとする。
        // (要素の追加は「UnsupportedOperationException」の例外が発生する。)
        IMMUTABLE_FRUITS_MAP = Collections.unmodifiableMap(tempMap);
    }

    public static void main(String[] args) {
        // 1.たろう、はなこ、じろうの名前をキーとした連想配列を宣言
        Map<String, Map<String, Integer>> salesData = new HashMap<>();

        // 2.フルーツの名前をキーとし、購入した個数を値とした連想配列を各人に関連付け
        Map<String, Integer> taroSales = new HashMap<>();
        taroSales.put("Apple", 5);
        taroSales.put("Banana", 1);
        taroSales.put("Orange", 3);

        Map<String, Integer> hanakoSales = new HashMap<>();
        hanakoSales.put("Apple", 3);
        hanakoSales.put("Banana", 4);
        hanakoSales.put("Orange", 1);

        Map<String, Integer> jiroSales = new HashMap<>();
        jiroSales.put("Apple", 1);
        jiroSales.put("Banana", 2);
        jiroSales.put("Orange", 2);

        salesData.put("taro", taroSales);
        salesData.put("hanako", hanakoSales);
        salesData.put("jiro", jiroSales);;

        // 3.生成した連想配列を処理して、各フルーツの売れた個数を求める
        // (※任意:順番を保持する為、LinkedHashMapを生成。)
        Map<String, Integer> totalSales = new LinkedHashMap<>();
        for (String person : salesData.keySet()) {
            Map<String, Integer> personSales = salesData.get(person);
            for (String fruit : personSales.keySet()) {
                int quantity = personSales.get(fruit);
                totalSales.put(fruit, totalSales.getOrDefault(fruit, 0) + quantity);
            }
        }

        // 結果を表示
        for (String fruit : totalSales.keySet()) {
            int quantity = totalSales.get(fruit);
            System.out.println(IMMUTABLE_FRUITS_MAP.get(fruit) + " の売れた個数: " + quantity);
        }
    }
}

まとめ

今回は連想配列について出題しました。
連想配列の使い方を理解するのに少し時間がかかるかもしれませんが、連想配列を使う機会は多々あると思います。
ぜひ、自身のプログラミングで活用し学習を進めてください!

メンバー募集のお知らせ

dcWORKSでは一緒に働く仲間を常時募集しています。私たちと一緒に人々の心を動かすものを創りませんか?
今なら就職お祝い金プレゼントキャンペーンを実施中です。ぜひご応募ください。

興味がある方は以下からお気軽にご応募ください。

募集要項はこちら

ITエンジニアを目指したい方へ

dcWORKSではIT業界の慢性的な人材不足解消・20代人材のキャリアプラン創造のためEngineers Gateを運営しています。
Engineers Gateでは無料でITエンジニア(プログラマー・インフラエンジニア)の育成型就職サポートを実施しております。

・IT業界に興味があるがどうやったら就職できるのか
・ITの勉強方法がわからない
・独学で限界を感じている方 etc

上記の様な悩みをお持ちの方は以下からお気軽に相談してください。

詳細はこちら

お気軽に
お問い合わせください。

CONTACT