この記事は 2026 年 8 月 27 日に投稿しました。

目次
- はじめに
- DartのHashSetから共通する要素を取得する
- intersectionメソッドの基本的な使い方
- HashSet同士の共通要素を取得する
- intersectionメソッドを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetから、別のIterableと共通する要素を取得できるintersectionメソッドについてです。
2. DartのHashSetから共通する要素を取得する
DartのHashSetでは、intersectionメソッドを使用すると、対象のHashSetと指定したIterableの両方に含まれる要素を取得できます。
intersectionメソッドの形式は以下になります。
Set<E> intersection(Iterable<Object?> other)
引数には、共通する要素を調べる別のIterableを指定します。
戻り値は、両方のコレクションに含まれる要素からなる新しいSetです。対象のHashSet自身が変更されることはありません。
例えば、次のようなHashSetがあるとします。
import 'dart:collection'; void main() { final numbers = HashSet<int>(); numbers.addAll([1, 2, 3, 4]); final otherNumbers = [3, 4, 5, 6]; final commonNumbers = numbers.intersection(otherNumbers); print(commonNumbers); }
実行すると、両方に含まれている3と4が取得されます。
{3, 4}
HashSetは要素の順序を保証しないため、表示順序は実行環境などによって異なる場合があります。
3. intersectionメソッドの基本的な使い方
intersectionメソッドは、HashSetとListなど、異なる種類のIterableの共通要素を取得する場合にも使用できます。
import 'dart:collection'; void main() { final languages = HashSet<String>(); languages.addAll(['Dart', 'Swift', 'C#']); final otherLanguages = ['Swift', 'Kotlin', 'C#']; final commonLanguages = languages.intersection(otherLanguages); print(commonLanguages); }
実行結果は以下になります。
{Swift, C#}
引数にはListだけでなく、別のHashSetやその他のIterableを指定できます。共通要素が存在しない場合は、空のSetが返されます。
final numbers = HashSet<int>.from([1, 2, 3]); final otherNumbers = [4, 5, 6]; final commonNumbers = numbers.intersection(otherNumbers); print(commonNumbers); // {}
戻り値を利用しても、numbersとotherNumbersの内容は変更されません。
4. HashSet同士の共通要素を取得する
2つのHashSetから共通する要素を取得する場合は、次のように記述できます。
import 'dart:collection'; void main() { final first = HashSet<int>.from([10, 20, 30, 40]); final second = HashSet<int>.from([30, 40, 50, 60]); final common = first.intersection(second); print(common); }
実行結果は以下になります。
{30, 40}
共通する要素だけを取り出して別の処理に渡したい場合や、2つの集合に含まれるデータを比較したい場合に利用できます。
例えば、2つのHashSetに含まれる共通のユーザーIDを取得できます。
final previousUsers = HashSet<int>.from([101, 102, 103]); final currentUsers = HashSet<int>.from([102, 103, 104]); final continuingUsers = previousUsers.intersection(currentUsers); print(continuingUsers); // {102, 103}
5. intersectionメソッドを使用する場合の注意点
元のHashSetは変更されない
intersectionメソッドは、共通要素から新しいSetを作成して返します。そのため、メソッドを呼び出した後も元のHashSetはそのまま残ります。
final numbers = HashSet<int>.from([1, 2, 3]); final common = numbers.intersection([2, 3, 4]); print(numbers); // {1, 2, 3} print(common); // {2, 3}
共通要素だけを残したい場合は、戻り値を元の変数へ代入する方法があります。ただし、finalで宣言した変数へ再代入はできないため、必要に応じてvarを使用します。
var numbers = HashSet<int>.from([1, 2, 3]); numbers = numbers.intersection([2, 3, 4]); print(numbers); // {2, 3}
重複要素は1つにまとめられる
Setは重複した要素を保持しないため、引数のIterableに同じ要素が複数含まれていても、戻り値には1つだけ格納されます。
final numbers = HashSet<int>.from([1, 2, 3]); final common = numbers.intersection([2, 2, 3, 3]); print(common); // {2, 3}
要素の順序は保証されない
HashSetは要素の順序を保証しません。そのため、intersectionメソッドの戻り値を表示した場合の順序も保証されません。
順序が必要な場合は、戻り値をtoListでListに変換した後、sortなどで並べ替えます。
final numbers = HashSet<int>.from([4, 1, 3, 2]); final common = numbers.intersection([2, 3, 4]); final sortedNumbers = common.toList()..sort(); print(sortedNumbers); // [2, 3, 4]
要素の比較には==とhashCodeが使用される
共通要素かどうかは、Setの要素比較のルールに基づいて判定されます。独自クラスのインスタンスを扱う場合は、==とhashCodeを適切に定義する必要があります。
元のHashSetを直接変更するメソッドではない
intersectionメソッドは、元のHashSetから共通要素を削除するメソッドではありません。元のHashSetを変更せずに結果を取得するメソッドです。
元のHashSetを直接変更しながら共通要素だけを残したい場合は、retainAllメソッドを使用します。ただし、retainAllは元のSetを変更するため、用途に応じて使い分けが必要です。
リファレンス
6. おわりに
DartのHashSetから、別のIterableと共通する要素を取得するには、intersectionメソッドを使用します。
final common = numbers.intersection(otherNumbers);
intersectionメソッドは、対象のHashSetと指定したIterableの両方に含まれる要素から、新しいSetを作成して返します。元のHashSetや引数のIterableは変更されません。
HashSet同士だけでなく、HashSetとListなどの異なるコレクションの共通要素も取得できます。ただし、HashSetは要素の順序を保証しないため、順序が必要な場合はListへ変換して並べ替えてください。
2つのコレクションに含まれる共通要素を調べたい場合に、intersectionメソッドを利用できます。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイムOSを利用したシステム開発をはじめ、弊社製品のハイブリッドOS Bi-OS など、長年培ってきた組み込み・制御系の技術を活かした開発に取り組んでいます。
また、iOS(Swift/SwiftUI)やWindows(C#)をはじめとしたアプリケーション開発、Webシステムの開発などにも対応しています。
組み込みソフトウェア、モバイルアプリ、Windowsアプリ、Webシステムなど、ソフトウェア開発に関するご相談がございましたら、お気軽にお問い合わせください。
また、ニューラルでは一緒にソフトウェア開発に取り組んでいただける技術者の方も募集しています。
ご興味がございましたら、お気軽にお問い合わせください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688