Set是无序集合类型,Set跟List都能保存一组数据,区别就是Set的元素都是唯一的。
Set-API: https://api.dart.dev/stable/2.10.3/dart-core/Set-class.html
本节方法不全,部分方法可参考List
定义常数的 Set
var s1 = const {1, 2};
// s1.add(3); //报错
print(s1); //{1, 2}
声明方式
// 字面量
var s1 = {'a', 'b'};
print(s1); //{a, b}
// 构造函数
var s2 = new Set();
s2.add('a');
print(s2); //{a}
类型推断
无指定泛型
字面量方式初始为空,报错
var s1 = {}; //如果为空,默认是Map,因为在作者在创建Dart语言的时候先有的Map
s1.add(1); //报错
字面量方式初始不为空,有默认推断
// 默认类型推断为 <String>
var s1 = {'a', 'b'};
s1.add('c');
// s1.add(1); //报错
字面量方式,无默认推断,可添加任意类型。
var s3 = {'a', 1};
s3.add(true);
s3.add(Symbol('a'));
print(s3); //{a, 1, true, Symbol("a")}
构造函数方式,无默认推断,可添加任意类型。
var s4 = new Set();
s4.add(true);
s4.add(Symbol('a'));
print(s4); //{true, Symbol("a")}
指定泛型
字面量方式指定
// 指定 int 类型
var s1 = <int>{1};
// Set s1 = <int>{1};
// Set<int> s1 = {1};
s1.add(2);
s1.add('a'); //报错
构造函数方式指定
// 指定 String 类型
var s2 = Set<String>();
// Set s2 = Set<String>();
// Set<String> s2 = Set();
s2.add('a');
s2.add(2); //报错
属性
length、first、last
length
长度first
第一个last
最后一个var s1 = {1, 2, 3};
print(s1.length); //3
// print(s1[1]); //报错 无序,所以没有下标
print(s1.first); //1
print(s1.last); //3
isEmpty、isNotEmpty 是否为空、是否不为空
var s1 = {1, 2, 3};
print(s1.isEmpty); //false
print(s1.isNotEmpty); //true
方法
转换
toList
var s1 = {1, 2};
print(s1.toList()); //[1, 2]
遍历
for 循环 不能用
for…in
var s1 = {1, 2, 3};
for (var v in s1) {
print(v); //依次输出 1 2 3
}
forEach
var s1 = {1, 2, 3};
s1.forEach((v) {
print(v); //依次输出 1 2 3
});
map
var s1 = {1, 2, 3, 4};
print(s1.map((v) => v * 2)); //Iterable (2, 4, 6, 8)
any、every
any
用于检测Set中是否有任意一个元素满足指定条件。不改变原 Setevery
用于检测Set中所有元素是否都符合指定条件。不改变原Set ```dart var s1 = {1, 2, 3}; print(s1.any((item) => item > 2)); //true print(s1.any((item) => item > 4)); //false
print(s1.every((item) => item > 0)); //true print(s1.every((item) => item > 2)); //false
<a name="hsFTa"></a>
### where、whereType、singleWhere 筛选元素
`where((e)=>(bool)` 根据指定参数函数筛选每个元素,符合条件的元素组成一个新的Iterable集合。**原Set不变**<br />`whereType()` 从无指定泛型的Set中,筛选出指定类型的数据,组成一个新的Iterable集合。**原Set不变**<br />`singleWhere((e)=>(bool>)` 找到那唯一满足条件的元素。**原Set不变**
```dart
var s1 = {1, 2, 3, 4};
print(s1.where((v) => v > 2)); //Iterable (3, 4)
var s2 = {1, 2, true, 'a'};
Iterable<int> s21 = s2.whereType();
print(s21); //(1, 2)
var s3 = {1, 2, 3, 4};
print(s3.singleWhere((item) => item == 2)); //2
// print(s3.singleWhere((item) => item > 10)); //报错
print(s3.singleWhere((item) => item > 10, orElse: () => 40)); //40
expand 扩展
根据现有的Set,指定一个规则,生成一个新的Iterable集合。原Set不变
var s1 = {1, 2, 3};
print(s1.expand((e) => ([e + 1, e + 2]))); //Iterator (2, 3, 3, 4, 4, 5)
add、addAll 添加
add(item)
添加一个。addAll({item, item, ...})
添加一组,无返回。原数组改变 ```dart var s1 = {1, 2, 3}; s1.add(4); print(s1); //{1, 2, 3, 4}
s1.addAll({5, 6}); //等同于 s1.addAll([5, 6]); print(s1); //{1, 2, 3, 4, 5, 6}
<a name="CzQ5q"></a>
## union 联合
联合另一个Set,返回合并后的新Set。**原数组不变**
```dart
var s1 = {1, 2, 3, 4, 5};
print(s1.union({2, 3, 10})); //{1, 2, 3, 4, 5, 10}
print(s1); //{1, 2, 3, 4, 5}
contains、containsAll 是否包含
contains(item)
是否包含一个。containsAll([item, item, ...])
是否包含一组。var s1 = {1, 2, 3, 4, 5};
print(s1.contains(2)); //true
print(s1.containsAll([2, 4])); //true 等同于 s1.containsAll({2, 4})
print(s1.containsAll({2, 40})); //false 只要有一项没有找到,就返回false。
remove、removeAll、removeWhere、clear 删除
remove(item)
删除一个,返回bool值。removeAll([item, item, ...])
删除一组,无返回。removeWhere((item) => (bool))
按条件删除,无返回。clear()
清空。 ```dart // remove(item) var s1 = {1, 2, 3, 4, 5}; print(s1.remove(2)); //true print(s1.remove(20)); //false 如果没有找到,返回 false。 print(s1); //{1, 3, 4, 5}
// removeAll([item, item, …]) var s2 = {1, 2, 3, 4, 5}; s2.removeAll([2, 4]); //等同于 s2.removeAll({2, 4}) print(s2); //{1, 3, 5}
var s3 = {1, 2, 3, 4, 5}; s3.removeAll({2, 40}); //只删除找到的选项 print(s3); //{1, 3, 4, 5}
// removeWhere((item) => (bool)) var s4 = {1, 2, 3, 4, 5}; s4.removeWhere((item) => item > 2); //删除Set中大于2的对象 print(s4); //{1, 2}
// clear() var s5 = {1, 2, 3}; s5.clear(); print(s5); //{}
<a name="qeRr7"></a>
## retainAll、retainWhere 保留
- `retainAll()` 只保留几个,无返回。
- `retainWhere()` 按条件保留,无返回。
```dart
// retainAll
var s1 = {1, 2, 3, 4, 5};
s1.retainAll({1, 3}); //只保留{1, 3}
print(s1); //{1, 3}
// retainWhere
var s2 = {1, 2, 3, 4, 5};
s2.retainWhere((item) => item > 2); //只保留大于2的
print(s2); //{3, 4, 5}
intersection、difference 交集、差集
intersection
取两个Set的交集,返回新Set。原Set不变difference
取两个Set的差集,返回新Set。原Set不变 ```dart var s1 = {1, 2, 3, 4, 5}; print(s1.intersection({2, 3, 10})); //{2, 3} print(s1); //{1, 2, 3, 4, 5}
print(s1.difference({2, 3, 10})); //{1,4,5} print(s1); //{1, 2, 3, 4, 5}
<a name="g51uE"></a>
## lookup 查询元素
按对象查询,返回查找的对象。
```dart
var s1 = {1, 2, 3, 4, 5};
print(s1.lookup(2)); //2
print(s1.lookup(20)); //null
firstWhere、lastWhere
firstWhere((e)=>(bool))
返回第一个满足条件的元素(不是元素的index)lastWhere((e)=>(bool))
从后往前找,返回第一个满足条件的元素的值(不是index)
var s1 = {1, 2, 3, 4, 5};
print(s1.firstWhere((item) => item > 2)); //3
print(s1.lastWhere((item) => item > 2)); //5
// 返回满足条件的第一个元素,不满足 报错
// print(s1.firstWhere((item) => item > 20));
// 返回满足条件的第一个元素,不满足 返回orElse方法的返回值
print(s1.firstWhere((item) => item > 20, orElse: () => 10)); //10