戦えプログラマン

いつだって戦いなのだ

年ごとにまとめた誕生日のリストを作る

よく訓練されたペチパーは全てを連想配列にぶち込んで物事を解決するのが一般的だが、
どうも Java だと、List だの Hash だの Set だのを使い分けないといけないらしい。
例えば下記のようなデータ構造を作りたい場合。

// (例) php var_dump風
array (
    1995 =>
    array(
        0 => MemberObject
        1 => MemberObject
        2 => MemberObject
        3 => MemberObject
    ),
    1994 =>
    array(
        0 => MemberObject
    ),
    1988 =>
    array(
        0 => MemberObject
        1 => MemberObject
    ),
);

// 要するに
array["誕生年"]["Index"] = MemberObject;

たったこれだけのことをしたいがために、Javaだと。

public void test_誕生年ごとのMapを作る() throws Exception {
    // 若い順
    List<Member> memberList = memberBhv.selectList(cb -> {
        cb.query().setBirthdate_IsNotNull();
        cb.query().addOrderBy_Birthdate_Desc();
    });

    // 誕生年ごとにまとめたMemberMap(key:年, value:Entity)
    Map<Integer, List<Member>> birthYearToMemberListMap = new HashMap<>();

    // 年のSet(降順、誕生日の存在する年のみ、Mapのkeyにも使える)
    LinkedHashSet<Integer> birthYearSet = new LinkedHashSet<>();

    memberList.forEach(m -> {
        Integer birthYear = m.getBirthdate().getYear();
        List<Member> inMapMemberList = birthYearToMemberListMap.get(birthYear);
        if (inMapMemberList == null) {
            // 年のマップが無ければ、新規作成
            inMapMemberList = new ArrayList<Member>();
            birthYearToMemberListMap.put(birthYear, inMapMemberList);

            // 誕生日者がいる年のみSet化
            birthYearSet.add(birthYear);
        }
        inMapMemberList.add(m);
    });

    // 出力確認
    birthYearSet.forEach(year -> {
        log("★☆★ " + year + "年 ★☆★");
        birthYearToMemberListMap.get(year).forEach(m -> log(m.getMemberId(), m.getBirthdate()));
    });
}

マジ?