C#で2つのHashSetの交差(積集合)を求める方法
C#で2つのHashSetの共通部分(積集合)を求めるには、IntersectWith()メソッドを使用します。このメソッドは、現在のHashSetに対して、引数で渡したコレクションにも存在する要素のみを残すようにセットを書き換えます。
IntersectWith()メソッドのポイント
- 破壊的メソッド:戻り値はvoidで、計算結果は呼び出し元のHashSet自体に反映されます。
- 重複は自動的に排除:HashSetは同一の値を複数回Addしても1つしか保持しません。
- 順序は保証されない:HashSetは要素の並び順を管理しないため、表示順序は格納順と異なる場合があります。
例1:文字列のHashSet同士の交差
まず、文字列を格納した2つのHashSetで交差を求めてみます。あわせて、IsSupersetOf()メソッドによる上位集合(スーパーセット)の判定も確認しています。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
HashSet<string> set1 = new HashSet<string>();
set1.Add("AB");
set1.Add("CD");
set1.Add("EF");
set1.Add("AB"); // 重複のため無視される
set1.Add("IJ");
set1.Add("KL");
set1.Add("EF"); // 重複のため無視される
set1.Add("OP");
Console.WriteLine("Elements in HashSet1");
foreach(string val in set1){
Console.WriteLine(val);
}
HashSet<string> set2 = new HashSet<string>();
set2.Add("EF");
set2.Add("KL");
Console.WriteLine("\nElements in HashSet2");
foreach(string val in set2){
Console.WriteLine(val);
}
Console.WriteLine("Count of elements in HashSet2 = " + set2.Count);
set2.Remove("KL");
Console.WriteLine("\nElements in HashSet2... (UPDATED)");
foreach(string res in set2){
Console.WriteLine(res);
}
Console.WriteLine("Count of elements in HashSet2 (Updated) = " + set2.Count);
Console.WriteLine("\nIs set1 a superset of set2? " + set1.IsSupersetOf(set2));
set1.IntersectWith(set2);
Console.WriteLine("\nIntersection result...");
foreach(string str in set1){
Console.WriteLine(str);
}
}
}
出力
上記のコードを実行すると、次のような結果が出力されます。
Elements in HashSet1 AB CD EF IJ KL OP Elements in HashSet2 EF KL Count of elements in HashSet2 = 2 Elements in HashSet2... (UPDATED) EF Count of elements in HashSet2 (Updated) = 1 Is set1 a superset of set2? True Intersection result... EF
set2から「KL」を削除した後、set1とset2の両方に存在するのは「EF」だけです。そのため、交差の結果として「EF」のみが出力されています。
例2:整数のHashSet同士の交差
続いて、int型の値を格納した2つのHashSetで交差を求める例を見てみましょう。今回は2つのセットにまったく同じ要素が含まれているため、交差の結果は元のセットと同一になります。
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
HashSet<int> set1 = new HashSet<int>();
set1.Add(30);
set1.Add(60);
set1.Add(70);
set1.Add(80);
set1.Add(100);
set1.Add(125);
Console.WriteLine("Elements in HashSet1");
foreach(int val in set1){
Console.WriteLine(val);
}
HashSet<int> set2 = new HashSet<int>();
set2.Add(30);
set2.Add(60);
set2.Add(70);
set2.Add(80);
set2.Add(100);
set2.Add(125);
Console.WriteLine("\nElements in HashSet2");
foreach(int val in set2){
Console.WriteLine(val);
}
set1.IntersectWith(set2);
Console.WriteLine("\nIntersection result...");
foreach(int val in set1){
Console.WriteLine(val);
}
}
}
出力
上記のコードを実行すると、次のような結果が出力されます。
Elements in HashSet1 30 60 70 80 100 125 Elements in HashSet2 30 60 70 80 100 125 Intersection result... 30 60 70 80 100 125
まとめ
HashSet同士の共通要素を求めたい場合は、IntersectWith()メソッドが便利です。なお、元のセットを変更せずに交差を取得したい場合は、LINQのIntersect()拡張メソッドを使えば、新しいコレクションとして結果を受け取ることもできます。用途に応じて使い分けるとよいでしょう。
-
C言語で2つの複素数の和を求めるプログラム
a1 + ib1 と a2 + ib2 の形式で表される2つの複素数が与えられたとき、これら2つの複素数の和を求めるのが本記事の目的です。複素数とは「a + ib」の形で表すことのできる数のことです。ここで「a」と「b」は実数、「i」は虚数単位と呼ばれる虚数です。虚数単位 i は方程式 x² = −1 の解であり、この等式を満たす実数は存在しないため、虚数と呼ばれています。入出力例例1入力a1 = 3, b1 = 8 a2 = 5, b2 = 2出力複素数1: 3 + i8 複素数2: 5 + i2 複素数の和: 8 + i10解説(3+i8) + (5+i2) = (3+5) + i(8+2
-
C++で2つの連結リストの交点を見つける方法
連結リストとは連結リスト(Linked List)は線形データ構造の一種です。各ノードは2つの部分で構成されており、一方にはノードの値(データ)が、もう一方には次のノードへのアドレス(ポインタ)が格納されています。ここでは、各ノードがリスト内の他のノードを指すポインタを持つ連結リストを想定します。この問題のタスクは、2つの連結リストが交差するノードを見つけることです。交差していない場合は、NULL(空)を出力として返します。入力例1出力:2解説: 与えられた連結リストは値「2」のノードで交差しているため、「2」を出力として返します。入力例2出力:NULL解説: 共通するノードが存在しないため、