【Java】リスト内の同じ数字の件数をカウントし、2つのリストで多い方を表示する

■概要

以下の2つのリスト内の数字の件数をカウントして、それぞれMapに格納する。

LIST1:
1, 2, 6, 7, 4, 2, 4, 7, 8, 3, 3, 0, 5, 3, 2, 1, 5, 6
↓
0:1件, 1:2件, 2:3件, 3:3件, 4:2件, 5:2件, 6:2件, 7:2件, 8:1件
LIST2:
3, 4, 2, 8, 4, 6, 3, 8, 9, 4, 6, 7, 8, 3, 2, 5, 6, 7, 4, 1
↓
1:1件, 2:2件, 3:3件, 4:4件, 5:1件, 6:3件, 7:2件, 8:3件, 9:1件

上記で作成した2つのMapの件数を比較し、それぞれ以下の結果Mapを作成する。

  • List1 > List2の場合 -> FROM_1_LARGE
    例:「1」の場合、List1が「2件」でList2が「1件」
  • List1 < List2の場合 -> FROM_2_LARGE
    例:「4」の場合、List1が「2件」でList2が「4件」
  • List1 = List2の場合 -> EQUAL
    例:「3」の場合、List1が「4件」でList2が「4件」
  • List1のみ存在の場合 -> FROM_1_ONLY
    例:「0」の場合、List1が「1件」でList2が「0件」
  • List2のみ存在の場合 -> FROM_2_ONLY
    例:「9」の場合、List1が「0件」でList2が「1件」

■フローチャート

実装する処理のフローチャートを以下に示す。

・メイン処理

開始
開始
list1の件数取得
list1の件数取得
list1の結果出力
list1の結果出力
list1の結果
list1の結果
コンソール
コンソール
list2の件数取得
list2の件数取得
list2の結果出力
list2の結果出力
list2の結果
list2の結果
コンソール
コンソール
結果用Map初期化
結果用Map初期化
list1の要素分繰り返し
list1の要素分繰り返し
list1の値が
list2に
list1の値が…
ある
ある
ない
ない
list1の件数
>
list2の件数
list1の件数…
true
true
FROM_1_LARGEをセット
FROM_1_LARGEをセット
false
false
list1の件数
<
list2の件数
list1の件数…
FROM_2_LARGEをセット
FROM_2_LARGEをセット
EQUALをセット
EQUALをセット
FROM_1_ONLYをセット
FROM_1_ONLYをセット
list2の要素分繰り返し
list2の要素分繰り返し
list1の値が
list2に
list1の値が…
ある
ある
ない
ない
FROM_2_ONLYをセット
FROM_2_ONLYをセット
終了
終了
結果出力
結果出力
list1の結果
list1の結果
コンソール
コンソール
true
true
false
false
Text is not SVG – cannot display

・リスト内の重複する数字をカウントする処理

開始
開始
返却用Mapセット
返却用Mapセット
リストの要素分繰り返し
リストの要素分繰り返し
返却用
MAP
返却用 MAP
格納済
格納済
新規
新規
件数を加算
件数を加算
新規で1件として格納
新規で1件として格納
return
返却用Map
return…
終了
終了
Text is not SVG – cannot display

■サンプルコード

・CountInListMain.java

package main;

import constant.CountInListEnum;
import java.util.HashMap;
import java.util.Map;

public class CountInListMain {

  private static final int[] LIST_DATA_1 = {
      1, 2, 6, 7, 4, 2, 4, 7, 8, 3, 3, 0, 5, 3, 2, 1, 5, 6
  };
  private static final int[] LIST_DATA_2 = {
      3, 4, 2, 8, 4, 6, 3, 8, 9, 4, 6, 7, 8, 3, 2, 5, 6, 7, 4, 1
  };

  public static void main(String[] args) {

    // list1の件数を取得
    Map<Integer, Integer> mapData1 = counter(LIST_DATA_1);
    System.out.println(mapData1);

    // list2の件数を取得
    Map<Integer, Integer> mapData2 = counter(LIST_DATA_2);
    System.out.println(mapData2);

    // 結果用Map初期化
    Map<Integer, String> resultMap = new HashMap<>();

    // list1の件数分繰り返し
    for (int numFrom1 : mapData1.keySet()) {
      // list1の値がlist2に存在する場合
      if (mapData2.containsKey(numFrom1)) {
        // list1の件数 > list2の件数
        if (mapData1.get(numFrom1) > mapData2.get(numFrom1)) {
          // FROM_1_LARGEをセット
          resultMap.put(numFrom1, CountInListEnum.FROM_FIRST_LARGE.getCountInListEnum());

        // list1の件数 < list2の件数
        } else if (mapData1.get(numFrom1) < mapData2.get(numFrom1)) {
          // FROM_2_LARGEをセット
          resultMap.put(numFrom1, CountInListEnum.FROM_SECOND_LARGE.getCountInListEnum());

        // list1の件数 = list2の件数
        } else {
          // EQUALをセット
          resultMap.put(numFrom1, CountInListEnum.EQUAL.getCountInListEnum());
        }

      // list1の値がlist2に存在しない場合
      } else {
        // FROM_1_ONLYをセット
        resultMap.put(numFrom1, CountInListEnum.FROM_FIRST_ONLY.getCountInListEnum());
      }
    }

    // リスト2の件数分繰り返し
    for (int numFrom2 : mapData2.keySet()) {
      // list2の値がlist1に存在しない場合
      if (!mapData1.containsKey(numFrom2)) {
        // FROM_2_ONLYをセット
        resultMap.put(numFrom2, CountInListEnum.FROM_SECOND_ONLY.getCountInListEnum());
      }
    }
    // 結果出力
    System.out.println(resultMap);
  }

  /**
   * リスト内の重複する数字をカウントする処理
   * @param targetList: 対象の数字リスト
   * @return Map<Integer, Integer>: 数字ごとの件数
   */
  private static Map<Integer, Integer> counter(int[] targetList) {
    // 返却用MAP
    Map<Integer, Integer> counterMap = new HashMap<>();

    // リストの要素分繰り返し
    for (int data : targetList) {
      // すでにMapに格納ずみの場合
      if (counterMap.containsKey(data)) {
        // 件数を加算
        counterMap.put(data, counterMap.get(data) + 1);

      // Mapに値がない場合
      } else {
        // 新規で1件として格納
        counterMap.put(data, 1);
      }
    }

    return counterMap;
  }
}

・CountInListEnum.java

package constant;

public enum CountInListEnum {

  FROM_FIRST_LARGE("FROM_1_LARGE"),
  FROM_SECOND_LARGE("FROM_2_LARGE"),
  FROM_FIRST_ONLY("FROM_1_ONLY"),
  FROM_SECOND_ONLY("FROM_2_ONLY"),
  EQUAL("EQUAL");

  private final String fromData;

  private CountInListEnum(String fromData) {
    this.fromData = fromData;
  }

  public String getCountInListEnum() {
    return fromData;
  }

}

■実行結果

{0=1, 1=2, 2=3, 3=3, 4=2, 5=2, 6=2, 7=2, 8=1}
{1=1, 2=2, 3=3, 4=4, 5=1, 6=3, 7=2, 8=3, 9=1}
{0=FROM_1_ONLY, 1=FROM_1_LARGE, 2=FROM_1_LARGE, 3=EQUAL, 4=FROM_2_LARGE, 5=FROM_1_LARGE, 6=FROM_2_LARGE, 7=EQUAL, 8=FROM_2_LARGE, 9=FROM_2_ONLY}

コメント

タイトルとURLをコピーしました