C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のHashSetを使って3つの配列から共通要素を見つけるプログラム

この記事では、C#のHashSetを活用して、3つの配列に共通する要素を効率的に見つける方法を解説します。まず比較対象となる3つの整数型配列を用意し、それぞれをHashSetに変換してから、共通する値を抽出していきます。

1. 3つの配列を定義する

はじめに、共通要素を調べる対象となる3つの配列を宣言します。

int[] arr1 = {
    99,
    57,
    63,
    98
};

int[] arr2 = {
    43,
    99,
    33,
    57
};

int[] arr3 = {
    99,
    57,
    42
};

2. 配列をHashSetに変換する

次に、各配列の要素をもとにHashSetを作成します。HashSetは重複する要素を自動的に除外し、一意な値だけを保持できるため、共通要素の検索処理に適しています。

// 1つ目のHashSet
var h1 = new HashSet<int>(arr1);
// 2つ目のHashSet
var h2 = new HashSet<int>(arr2);
// 3つ目のHashSet
var h3 = new HashSet<int>(arr3);

完全なサンプルコード

ここまでの手順をまとめた、3つの配列から共通要素を見つける完全なコードが以下です。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program {
    public static void Main() {
        int[] arr1 = {
            99,
            57,
            63,
            98
        };

        int[] arr2 = {
            43,
            99,
            33,
            57
        };

        int[] arr3 = {
            99,
            57,
            42
        };

        // HashSet One
        var h1 = new HashSet<int>(arr1);
        // HashSet Two
        var h2 = new HashSet<int>(arr2);
        // HashSet Three
        var h3 = new HashSet<int>(arr3);

        // 表示(セット1)
        int[] val1 = h1.ToArray();
        Console.WriteLine("Set one...");
        foreach(int val in val1) {
            Console.WriteLine(val);
        }

        // 表示(セット2)
        int[] val2 = h2.ToArray();
        Console.WriteLine("Set two...");
        foreach(int val in val2) {
            Console.WriteLine(val);
        }

        // 表示(セット3)
        int[] val3 = h3.ToArray();
        Console.WriteLine("Set three...");
        foreach(int val in val3) {
            Console.WriteLine(val);
        }

        int i = 0, j = 0, k = 0;
        Console.WriteLine("Common elements...");
        while (i < val1.Length && j < val2.Length && k < val3.Length) {
            if (val1[i] == val2[j] && val2[j] == val3[k]) {
                Console.Write(val1[i] + " ");
                i++;
                j++;
                k++;
            }
            // x < y の場合
            else if (val1[i] < val2[j])
            i++;
            // y < z の場合
            else if (val2[j] < val3[k])
            j++;
            else
            k++;
        }
    }
}

コードの解説

このプログラムでは、各HashSetの内容をいったん配列(val1val2val3)に変換し、3つのインデックス(ijk)を使って同時に走査する「3ポインタ方式」を採用しています。

  • 3つの値がすべて一致した場合は、その値を共通要素として出力し、3つのインデックスをそれぞれ進めます。
  • val1[i]val2[j]より小さい場合はiを、val2[j]val3[k]より小さい場合はjを進め、小さい側の要素を読み飛ばします。
  • 上記以外の場合はkを進めます。

この手法により、線形時間(O(n))で共通要素を効率よく検出できます。なお、HashSetの要素順序は仕様上保証されていないため、実運用では事前にOrderBy()などでソートしてから比較すると、より安全に動作させられます。

実行結果

Set one...
99
57
63
98
Set two...
43
99
33
57
Set three...
99
57
42
Common elements...
99 57

このように、3つの配列すべてに存在する「99」と「57」が共通要素として正しく出力されます。

  1. 2つの配列から共通しない要素を抽出するJavaScriptプログラム

    ここに、2つの数値の配列があるとします。const arr1 = [12, 54, 2, 4, 6, 34, 3]; const arr2 = [54, 2, 5, 12, 4, 1, 3, 34];このような2つの配列を受け取り、両方の配列に共通して存在しない要素(片方にしかない要素)だけを返すJavaScript関数を作成する必要があります。実装の考え方この問題は、以下の手順で解決できます。1つ目の配列をループで走査し、その要素が2つ目の配列に存在しない場合は結果に追加する同様に、2つ目の配列を走査し、1つ目の配列に存在しない要素を結果に追加する要素の存在確認には、indexOf()メソッ

  2. 【Android開発】ListViewで2つの配列から共通要素を抽出する方法

    このチュートリアルでは、AndroidアプリのListViewを使用して、2つの配列に含まれる共通要素(重複している値)を検出し、画面に表示する方法を解説します。サンプルでは、2つの文字列型配列を比較し、両方に存在する要素だけをArrayListに格納してListViewへ表示します。 手順1:新しいプロジェクトを作成する まず、Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目(プロジェクト名、パッケージ名、保存先など)をすべて入力してください。 手順2:レイアウトファイルを編集する 次に、res/layout/