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

目次
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetに複数の要素をまとめて追加するaddAllメソッドについてです。
2. DartのHashSetに複数の要素を追加する
DartのHashSetに複数の要素をまとめて追加するには、addAllメソッドを使用します。
addAllメソッドの形式は以下になります。
void addAll(Iterable<E> elements)
引数elementsに追加する要素を格納したIterableを指定します。
例えば、複数の文字列を格納したListをまとめてHashSetに追加できます。
実装例
import 'dart:collection'; void main() { final set = HashSet<String>(); set.addAll([ 'Apple', 'Orange', 'Banana', ]); print(set); }
実行結果の例
{Apple, Orange, Banana}
この例では、空のHashSet<String>を作成したあと、addAllメソッドを使用してApple、Orange、Bananaの3つの文字列をまとめて追加しています。
addメソッドを使用する場合は、
set.add('Apple'); set.add('Orange'); set.add('Banana');
のように要素ごとにメソッドを呼び出す必要がありますが、addAllメソッドを使用すると複数の要素を一度に追加できます。
また、すでに要素が格納されているHashSetに対しても使用できます。
import 'dart:collection'; void main() { final set = HashSet<String>(); set.add('Apple'); set.addAll([ 'Orange', 'Banana', ]); print(set); }
実行結果の例
{Apple, Orange, Banana}
既存の要素を残したまま、addAllメソッドで指定した要素が追加されます。
なお、HashSetでは要素の順序は保証されないため、実行環境などによって表示される順序が異なる可能性があります。
3. addAllメソッドに指定できる値
addAllメソッドの引数はIterable<E>です。
そのため、Listだけでなく、SetなどのIterableを実装しているオブジェクトを指定できます。
例えば、Listの要素を追加する場合は次のようになります。
import 'dart:collection'; void main() { final set = HashSet<String>(); final fruits = <String>[ 'Apple', 'Orange', 'Banana', ]; set.addAll(fruits); print(set); }
また、別のSetに格納されている要素を追加することもできます。
import 'dart:collection'; void main() { final set1 = HashSet<String>(); set1.addAll([ 'Apple', 'Orange', ]); final set2 = <String>{ 'Banana', 'Grape', }; set1.addAll(set2); print(set1); }
実行結果の例
{Apple, Orange, Banana, Grape}
このように、addAllメソッドは複数の要素を持つコレクションからHashSetへまとめて要素を追加したい場合に便利です。
なお、addAllメソッドの戻り値はvoidです。
そのため、addメソッドのように、要素が新しく追加されたかどうかを戻り値で確認することはできません。
4. 重複する要素を追加した場合
Setは同じ要素を複数保持しません。
そのため、addAllメソッドに指定した要素の中に同じ値が複数含まれていても、HashSetに同じ要素が複数追加されることはありません。
実装例
import 'dart:collection'; void main() { final set = HashSet<String>(); set.addAll([ 'Apple', 'Orange', 'Apple', 'Banana', 'Orange', ]); print(set); print(set.length); }
実行結果の例
{Apple, Orange, Banana}
3
addAllメソッドには5つの要素を指定していますが、AppleとOrangeがそれぞれ重複しています。
HashSetでは同じ要素を複数保持しないため、格納される要素はApple、Orange、Bananaの3つになります。
すでにHashSetに存在する要素を追加した場合も同様です。
import 'dart:collection'; void main() { final set = HashSet<String>(); set.addAll([ 'Apple', 'Orange', ]); set.addAll([ 'Orange', 'Banana', ]); print(set); print(set.length); }
実行結果の例
{Apple, Orange, Banana}
3
2回目のaddAllメソッドで指定したOrangeはすでに存在しているため、新しい要素として追加されません。
一方、Bananaは存在していないため、新しく追加されます。
このように、追加するコレクションに重複する要素が含まれていても、重複を意識せずまとめて追加できます。
5. addメソッドとの違い
addメソッドとaddAllメソッドの大きな違いは、追加する要素の数と戻り値です。
addメソッドの形式は以下になります。
bool add(E value)
1つの要素を追加し、新しい要素が追加された場合はtrue、すでに同じ要素が存在する場合はfalseを返します。
一方、addAllメソッドの形式は以下になります。
void addAll(Iterable<E> elements)
複数の要素をまとめて追加できますが、戻り値はvoidです。
そのため、それぞれの要素が新しく追加されたかどうかを戻り値から確認することはできません。
例えば、単純に複数の要素をまとめて追加したい場合は、
set.addAll([ 'Apple', 'Orange', 'Banana', ]);
のようにaddAllメソッドを使用すると簡潔に記述できます。
一方、それぞれの要素が新しく追加されたかどうかを確認したい場合は、addメソッドを使用できます。
final fruits = [ 'Apple', 'Orange', 'Banana', ]; for (final fruit in fruits) { if (set.add(fruit)) { print('$fruitを追加しました'); } else { print('$fruitはすでに存在します'); } }
単純に複数の要素をまとめて追加する場合はaddAllメソッド、要素ごとの追加結果を確認したい場合はaddメソッドというように使い分けるとよさそうです。
また、HashSetでは要素を追加した順序は保証されません。
追加した順序を保持する必要がある場合は、LinkedHashSetなどの利用を検討します。
リファレンス
6. おわりに
HashSetに複数の要素をまとめて追加するには、addAllメソッドを使用します。
addAllメソッドにはListやSetなどのIterableを指定でき、複数の要素を一度に追加できます。
また、HashSetは同じ要素を複数保持しないため、追加する要素に重複が含まれていた場合や、すでに同じ要素が存在する場合でも、重複した要素が増えることはありません。
addメソッドとの主な違いは、追加する要素数と戻り値です。
addメソッドは1つの要素を追加し、新しい要素が追加されたかどうかをbool型で返します。一方、addAllメソッドは複数の要素をまとめて追加でき、戻り値はvoidです。
単純に複数の要素をまとめて追加する場合はaddAllメソッド、それぞれの要素が追加されたかどうかを確認したい場合はaddメソッドというように使い分けるとよさそうです。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイム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