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

目次
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。 2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetに、指定した要素が含まれているか確認するcontainsメソッドについてです。
2. DartのHashSetに指定した要素が含まれているか確認する
DartのHashSetでは、containsメソッドを使用すると、指定した要素が格納されているかどうかを確認できます。
containsメソッドの形式は以下になります。
bool contains(Object? value)
引数valueに、存在を確認したい要素を指定します。
例えば、複数の文字列を格納したHashSetに、Flutterが含まれているか確認する場合は次のようになります。
実装例
import 'dart:collection'; void main() { final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', 'Swift', ]); print(set.contains('Flutter')); print(set.contains('Kotlin')); }
実行結果は次のようになります。
true false
setにはFlutterが格納されているため、
set.contains('Flutter')
はtrueを返します。
一方、Kotlinは格納されていないため、
set.contains('Kotlin')
はfalseを返します。
このように、containsメソッドを使用することで、HashSetの中に指定した要素が存在するかどうかを簡単に確認できます。
また、戻り値をif文の条件として使用することもできます。
if (set.contains('Flutter')) { print('Flutterが含まれています'); }
指定した要素が含まれている場合だけ処理を行いたい場合などに便利です。
3. containsメソッドの戻り値
containsメソッドの戻り値はboolです。
指定した要素がHashSetに含まれている場合はtrue、含まれていない場合はfalseを返します。
例えば、次のようになります。
import 'dart:collection'; void main() { final set = HashSet<int>(); set.addAll([ 10, 20, 30, ]); final result1 = set.contains(20); final result2 = set.contains(40); print(result1); print(result2); }
実行結果は次のようになります。
true false
20はsetに含まれているためtrue、40は含まれていないためfalseになります。
戻り値を利用して、要素が存在する場合と存在しない場合で処理を分けることもできます。
if (set.contains(20)) { print('20が含まれています'); } else { print('20は含まれていません'); }
また、要素が含まれていない場合だけ処理したい場合は、次のように否定演算子!を使用できます。
if (!set.contains(40)) { print('40は含まれていません'); }
例えば、同じ要素を追加する前に存在を確認する場合は、次のように記述できます。
if (!set.contains(40)) {
set.add(40);
}
ただし、HashSetは同じ要素を重複して保持しないため、単に要素を追加するだけであれば、事前にcontainsメソッドで確認する必要はありません。
addメソッド自体が、要素が新しく追加された場合はtrue、すでに存在していて追加されなかった場合はfalseを返します。
4. HashSetでの要素の比較
HashSetのcontainsメソッドでは、HashSetが使用している等価性の判定に基づいて、指定した要素が含まれているかどうかが判定されます。
通常のHashSetでは、オブジェクトの==演算子とhashCodeが要素の判定に使用されます。
文字列の場合は、同じ内容の文字列であれば同じ要素として判定されます。
import 'dart:collection'; void main() { final set = HashSet<String>(); set.add('Dart'); print(set.contains('Dart')); print(set.contains('dart')); }
実行結果は次のようになります。
true false
Dartとdartは大文字と小文字が異なるため、異なる文字列として扱われます。
そのため、
set.contains('Dart')
はtrueですが、
set.contains('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.add(User(1, 'Taro')); print(set.contains(User(1, 'Taro'))); print(set.contains(User(1, 'Jiro'))); print(set.contains(User(2, 'Taro'))); }
実行結果は次のようになります。
true true false
User(1, 'Taro')とUser(1, 'Jiro')はnameが異なりますが、idが同じため同じ要素として判定されます。
一方、User(2, 'Taro')はidが異なるため、別の要素として判定されます。
このように、独自クラスをHashSetで使用する場合は、どのような条件でオブジェクトを同じものとして扱うのかを考慮して、==演算子とhashCodeを実装する必要があります。
5. containsメソッドを使用する場合の注意点
containsメソッドは、指定した要素がHashSetに存在するかどうかを確認するためのメソッドです。
要素そのものを取得するメソッドではありません。
例えば、
final exists = set.contains('Dart');
で取得できるのはtrueまたはfalseであり、Dartという要素そのものが返されるわけではありません。
また、HashSetはハッシュ値を利用して要素を管理するため、格納した後に要素の==やhashCodeの結果に影響する値を変更すると、正しく検索できなくなる可能性があります。
例えば、次のような変更可能なクラスがあるとします。
class User { int id; 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を変更するとhashCodeも変化します。
final user = User(1, 'Taro'); final set = HashSet<User>(); set.add(user); print(set.contains(user)); user.id = 2; print(set.contains(user));
HashSetへ追加した後にhashCodeの計算に使用する値を変更すると、要素を正しく見つけられなくなる可能性があります。
そのため、HashSetの要素として独自クラスを使用する場合は、==やhashCodeの判定に使用する値を、要素が格納されている間は変更しないようにすることが重要です。
なお、containsメソッドはHashSet固有のメソッドではありません。
Setで定義されているメソッドなので、HashSet以外のSetでも利用できます。
また、Listなどの他のコレクションにもcontainsメソッドがありますが、HashSetではハッシュテーブルを利用して要素を管理している点が異なります。
多数の要素から特定の要素が含まれているかを繰り返し確認する用途では、HashSetの特徴を活かすことができます。
リファレンス
6. おわりに
DartのHashSetに指定した要素が含まれているか確認するには、containsメソッドを使用します。
例えば、
final set = HashSet<String>(); set.addAll([ 'Dart', 'Flutter', 'Swift', ]); print(set.contains('Flutter'));
とすると、Flutterがsetに含まれているため、
true
が返されます。
一方、
print(set.contains('Kotlin'));
では、Kotlinが含まれていないため、
false
が返されます。
containsメソッドの戻り値はboolなので、
if (set.contains('Flutter')) { print('Flutterが含まれています'); }
のように、要素が存在するかどうかによって処理を分ける場合にも利用できます。
また、HashSetでは、通常==演算子とhashCodeを使用して要素が同じかどうかを判定します。
独自クラスを要素として使用する場合は、==演算子とhashCodeを適切に実装することで、どのようなオブジェクトを同じ要素として扱うかを指定できます。
ただし、HashSetへ格納した後にhashCodeの計算に影響する値を変更すると、containsメソッドで正しく要素を検索できなくなる可能性があるため注意が必要です。
HashSetに特定の要素が存在するかを簡単に確認できるため、条件分岐や重複の確認など、さまざまな場面で利用できるメソッドです。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイム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