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

目次
- はじめに
- DartのHashSetに指定したすべての要素が含まれているか確認する
- containsAllメソッドの戻り値
- containsメソッドとの違い
- containsAllメソッドを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。 2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetに、指定したすべての要素が含まれているか確認するcontainsAllメソッドについてです。
2. DartのHashSetに指定したすべての要素が含まれているか確認する
DartのHashSetでは、containsAllメソッドを使用すると、指定した複数の要素がすべて格納されているかどうかを確認できます。
containsAllメソッドの形式は以下になります。
bool containsAll(Iterable<Object?> other)
引数otherに、存在を確認したい要素を格納したIterableを指定します。
例えば、複数の文字列を格納したHashSetに、DartとFlutterの両方が含まれているか確認する場合は次のようになります。
実装例
import 'dart:collection'; void main() { final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', 'Swift', ]); print(set.containsAll([ 'Dart', 'Flutter', ])); print(set.containsAll([ 'Dart', 'Kotlin', ])); }
実行結果は次のようになります。
true false
setにはDartとFlutterの両方が格納されているため、
set.containsAll([ 'Dart', 'Flutter', ])
はtrueを返します。
一方、
set.containsAll([ 'Dart', 'Kotlin', ])
では、Dartは格納されていますが、Kotlinは格納されていません。
containsAllメソッドでは、指定した要素の一部だけが含まれている場合はfalseになります。
このように、containsAllメソッドを使用することで、HashSetに複数の要素がすべて存在するかどうかをまとめて確認できます。
また、戻り値をif文の条件として使用することもできます。
if (set.containsAll([ 'Dart', 'Flutter', ])) { print('すべての要素が含まれています'); }
必要な要素がすべて揃っている場合だけ処理を行いたい場合などに便利です。
引数にはListだけでなく、別のSetなどのIterableを指定することもできます。
final required = HashSet<String>(); required.addAll([ 'Dart', 'Flutter', ]); print(set.containsAll(required));
この場合も、requiredに格納されているすべての要素がsetに含まれているため、trueが返されます。
3. containsAllメソッドの戻り値
containsAllメソッドの戻り値はboolです。
引数に指定したすべての要素がHashSetに含まれている場合はtrue、1つでも含まれていない要素がある場合はfalseを返します。
例えば、次のようになります。
import 'dart:collection'; void main() { final set = HashSet<int>(); set.addAll([ 10, 20, 30, 40, ]); final result1 = set.containsAll([ 10, 20, ]); final result2 = set.containsAll([ 10, 50, ]); print(result1); print(result2); }
実行結果は次のようになります。
true false
10と20はどちらもsetに含まれているため、result1はtrueになります。
一方、result2で指定している10は含まれていますが、50は含まれていないためfalseになります。
戻り値を利用して、必要な要素がすべて存在する場合と、存在しない場合で処理を分けることもできます。
if (set.containsAll([ 10, 20, ])) { print('必要な要素がすべて含まれています'); } else { print('含まれていない要素があります'); }
また、指定するIterableが空の場合についても確認してみます。
import 'dart:collection'; void main() { final set = HashSet<int>(); set.addAll([ 10, 20, 30, ]); print(set.containsAll([])); }
実行結果は次のようになります。
true
確認対象の要素が1つもない場合、含まれていない要素も存在しないためtrueになります。
そのため、containsAllメソッドへ渡すIterableが空になる可能性がある場合は、この動作を考慮して使用する必要があります。
4. containsメソッドとの違い
HashSetには、指定した要素が含まれているか確認するcontainsメソッドもあります。
containsメソッドとcontainsAllメソッドの違いは、確認する要素の数です。
containsメソッドでは、1つの要素が含まれているかを確認します。
final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', 'Swift', ]); print(set.contains('Dart'));
実行結果は次のようになります。
true
これに対してcontainsAllメソッドでは、複数の要素がすべて含まれているかを確認できます。
print(set.containsAll([ 'Dart', 'Flutter', ]));
実行結果は次のようになります。
true
containsAllメソッドを使用せず、containsメソッドだけで同じような判定を行う場合は、例えば次のように記述できます。
if (set.contains('Dart') && set.contains('Flutter')) { print('すべての要素が含まれています'); }
確認する要素が少ない場合はこのような記述でも問題ありませんが、要素が増えると条件式が長くなります。
containsAllメソッドを使用すると、
if (set.containsAll([ 'Dart', 'Flutter', ])) { print('すべての要素が含まれています'); }
のように、確認したい要素をまとめて記述できます。
また、確認する要素が動的に変化する場合にも便利です。
final required = <String>[ 'Dart', 'Flutter', ]; if (set.containsAll(required)) { print('必要な要素がすべて含まれています'); }
このように、1つの要素を確認する場合はcontainsメソッド、複数の要素がすべて含まれているか確認する場合はcontainsAllメソッドを使用するとわかりやすくなります。
5. containsAllメソッドを使用する場合の注意点
containsAllメソッドは、指定したすべての要素がHashSetに存在するかどうかを確認するためのメソッドです。
指定した要素のうち、1つでも存在しない要素がある場合はfalseになります。
例えば、
final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', 'Swift', ]); print(set.containsAll([ 'Dart', 'Kotlin', ]));
では、Dartは存在しますがKotlinが存在しないため、結果はfalseになります。
そのため、指定した要素のうち「どれか1つでも含まれているか」を確認するメソッドではない点に注意が必要です。
また、containsAllメソッドは、指定した要素そのものを取得するメソッドではありません。
final exists = set.containsAll([ 'Dart', 'Flutter', ]);
で取得できるのはtrueまたはfalseです。
さらに、HashSetでの要素の判定は、HashSetが使用している等価性の判定に基づいて行われます。
通常のHashSetでは、オブジェクトの==演算子とhashCodeが要素の判定に使用されます。
例えば、文字列の場合は大文字と小文字が区別されます。
import 'dart:collection'; void main() { final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', ]); print(set.containsAll([ 'Dart', 'Flutter', ])); print(set.containsAll([ 'dart', 'Flutter', ])); }
実行結果は次のようになります。
true false
Dartとdartは異なる文字列として扱われるため、dartを指定した場合はfalseになります。
独自クラスをHashSetの要素として使用する場合は、==演算子とhashCodeの実装も重要になります。
例えば、次のようなクラスを使用します。
class User { final int id; final String name; User(this.id, this.name); @override bool operator ==(Object other) { return other is User && other.id == id; } @override int get hashCode => id.hashCode; }
このクラスでは、idが同じであれば同じUserとして扱われます。
import 'dart:collection'; void main() { final set = HashSet<User>(); set.addAll([ User(1, 'Taro'), User(2, 'Jiro'), ]); print(set.containsAll([ User(1, 'Taro'), User(2, 'Jiro'), ])); print(set.containsAll([ User(1, 'Saburo'), User(2, 'Shiro'), ])); print(set.containsAll([ User(1, 'Taro'), User(3, 'Saburo'), ])); }
実行結果は次のようになります。
true true false
2つ目のcontainsAllメソッドではnameが異なりますが、idが同じため、すべての要素が含まれていると判定されます。
3つ目ではidが3のUserが存在しないため、falseになります。
また、HashSetへ格納した後にhashCodeの計算に影響する値を変更すると、containsAllメソッドでも正しく要素を検索できなくなる可能性があります。
そのため、独自クラスをHashSetの要素として使用する場合は、==やhashCodeの判定に使用する値を、要素が格納されている間は変更しないようにすることが重要です。
なお、containsAllメソッドはHashSet固有のメソッドではありません。
Setで定義されているメソッドなので、HashSet以外のSetでも利用できます。
複数の権限がすべて設定されているか、必要な項目がすべて選択されているかなど、複数の値が揃っていることを確認する場合に利用できます。
リファレンス
6. おわりに
DartのHashSetに指定したすべての要素が含まれているか確認するには、containsAllメソッドを使用します。
例えば、
final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', 'Swift', ]); print(set.containsAll([ 'Dart', 'Flutter', ]));
とすると、DartとFlutterの両方がsetに含まれているため、
true
が返されます。
一方、
print(set.containsAll([ 'Dart', 'Kotlin', ]));
では、Kotlinが含まれていないため、
false
が返されます。
containsAllメソッドの戻り値はboolなので、
if (set.containsAll([ 'Dart', 'Flutter', ])) { print('必要な要素がすべて含まれています'); }
のように、必要な要素がすべて存在する場合だけ処理を行うこともできます。
1つの要素が含まれているかを確認するcontainsメソッドに対して、containsAllメソッドでは、Iterableで指定した複数の要素がすべて含まれているかをまとめて確認できます。
ただし、指定した要素のうち1つでも含まれていない要素がある場合はfalseになります。
また、空のIterableを指定した場合はtrueになるため、確認する要素を動的に生成する場合などは注意が必要です。
HashSetでは、通常==演算子とhashCodeを使用して要素が同じかどうかを判定するため、独自クラスを要素として使用する場合は、これらを適切に実装することも重要です。
複数の要素がすべて揃っているかを簡潔に確認できるため、必要な項目や条件がすべて満たされていることを確認する場合などに利用できるメソッドです。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイム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