Closed20
DartのSetについて調べる
はじめに
公式ドキュメントのLanguage tourのページとSetのAPIリファレンスを読んでいく
動作確認はDartPadで行う
リテラル
{}
または<Type>{}
を使う
void main() {
final set1 = {1, 2, 3};
final set2 = <int>{};
print(set1); // {1, 2, 3}
print(set2); // {}
}
要素の追加
addまたはaddAllメソッドを使って要素を追加できる
void main() {
final set = <int>{};
set.add(1);
set.addAll([2, 3]);
print(set); // {1, 2, 3}
}
要素数
lengthプロパティを使って要素数を取得できる
void main() {
final set = {1, 2, 3};
print(set.length); // 3
}
定数
他と同様に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
}
展開
...
キーワードを使って展開できる
void main() {
final list = [1, 2, 3];
final set = {...list};
print(set); // {1, 2, 3}
}
リテラルでif
やfor
が利用できる
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}
}
ここまでLanguage tour
ここからAPIリファレンス
Setコンストラクタ
空のSetを作成する
void main() {
final set = Set<int>();
print(set); // {}
}
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関係がないと実行時エラーとなる
Set.identityコンストラクタ
identityベースの空のSetを作成する、identityベースが何なのかは謎
void main() {
final set = Set<int>.identity();
print(set); // {}
}
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'.
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
}
プロパティ
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
メソッド
大部分についてはリストと重複する部分があるため割愛する
differenceメソッド
差集合を得る
void main() {
final set1 = {1, 2, 3};
final set2 = {3, 4, 5};
final diff = set1.difference(set2);
print(diff); // {1, 2}
}
intersectionメソッド
共通部分を得る
void main() {
final set1 = {1, 2, 3};
final set2 = {3, 4, 5};
final intersection = set1.intersection(set2);
print(intersection); // {3}
}
lookup
要素を検索して見つかればその要素を返す、見つから無ければnullを返す
void main() {
final set = {"one", "two", "three"};
print(set.lookup("three")); // three
print(set.lookup("four")); // null
}
unitonメソッド
和集合を得る
void main() {
final set1 = {1, 2, 3};
final set2 = {3, 4, 5};
print(set1.union(set2)); // {1, 2, 3, 4, 5}
}
今更だけど
集合だから同じ要素を1つしか含めることができない
void main() {
final set = {1, 2, 3, 3, 2, 1};
print(set); // {1, 2, 3}
}
ここまでで一旦クローズ
次はNull Safetyについて調べる
このスクラップは2023/01/10にクローズされました