Closed20

DartのSetについて調べる

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

要素の追加

addまたはaddAllメソッドを使って要素を追加できる

void main() {
  final set = <int>{};
  set.add(1);
  set.addAll([2, 3]);
  print(set); // {1, 2, 3}
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

定数

他と同様にconstキーワードを使って定数にできる

void main() {
  final set1 = const {1, 2, 3};
  final set2 = const {1, 2, 3};
  final set3 = {1, 2, 3};

  print(set1 == set2); // true
  print(set1 == set3); // false
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

展開

...キーワードを使って展開できる

void main() {
  final list = [1, 2, 3];
  final set = {...list};
  print(set); // {1, 2, 3}
}

リテラルでifforが利用できる

void main() {
  final set = {
    if (true) 1,
    if (false) 2,
    for (var i = 3; i <= 5; i += 1) i,
  };

  print(set); // {1, 3, 4, 5}
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

Set.fromコンストラクタ

別の型のイテラブルから新しいSetを作成する

void main() {
  print(Set<Object>.from([1, 2, 3])); // {1, 2, 3}
  print(Set<String>.from([1, 2, 3])); // Uncaught Error: TypeError: 1: type 'JSInt' is not a subtype of type 'String'
}

変換前後の型にis-a関係がないと実行時エラーとなる

薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

Set.identityコンストラクタ

identityベースの空のSetを作成する、identityベースが何なのかは謎

void main() {
  final set = Set<int>.identity();
  print(set); // {}
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

Set.of

同じ型のイテラブルから新しいSetを作成する

void main() {
  final set = Set.of([1, 2, 3]);
  print(set); // {1, 2, 3}
}

型が異なるとコンパイルエラーとして警告してくれる

void main() {
  final set = Set<String>.of([1, 2, 3]);
  print(set); // {1, 2, 3}
}
The element type 'int' can't be assigned to the list type 'String'.
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

Set.unmodifiable

変更不可なリストを作成する、変更しようとすると実行時エラーとなる

void main() {
  final set = Set<int>.unmodifiable([1, 2, 3]);
  print(set); // {1, 2, 3}
  set.add(4); // Uncaught Error: Unsupported operation: Cannot change an unmodifiable set
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

プロパティ

Setには継承したものを含めて9つのプロパティがある

  • first:最初の要素、順序という概念があるのだろうか?
  • hashCode:Setごとにほぼ一意な整数
  • isEmpty:空ならばtrue
  • isNotEmpty:空出なければtrue
  • iterator:イテレーター
  • last:最後の要素
  • length:要素数
  • runtimeType:ランタイムタイプ
  • single:要素数が1つならその要素、それ以外であればエラー
void main() {
  final set = {1, 2, 3};
  print(set.first); // 1
  print(set.last); // 3
  print(set.runtimeType); // _LinkedHashSet<int>
  print(set.single); // Uncaught Error: Bad state: Too many elements
}

ついでにイテレーターの使い方

void main() {
  final set = {1, 2, 3};
  final iterator = set.iterator;
  
  while (iterator.moveNext()) {
    print(iterator.current);
  }
}

実行結果は下記の通り

1
2
3
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

differenceメソッド

差集合を得る

void main() {
  final set1 = {1, 2, 3};
  final set2 = {3, 4, 5};
  final diff = set1.difference(set2);
  print(diff); // {1, 2}
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

intersectionメソッド

共通部分を得る

void main() {
  final set1 = {1, 2, 3};
  final set2 = {3, 4, 5};
  final intersection = set1.intersection(set2);
  print(intersection); // {3}
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

lookup

要素を検索して見つかればその要素を返す、見つから無ければnullを返す

void main() {
  final set = {"one", "two", "three"};
  print(set.lookup("three")); // three
  print(set.lookup("four")); // null
}
薄田達哉 / tatsuyasusukida薄田達哉 / tatsuyasusukida

今更だけど

集合だから同じ要素を1つしか含めることができない

void main() {
  final set = {1, 2, 3, 3, 2, 1};
  print(set); // {1, 2, 3}
}
このスクラップは2023/01/10にクローズされました