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语言的时候先有的Maps1.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); //1print(s1.last); //3
isEmpty、isNotEmpty 是否为空、是否不为空
var s1 = {1, 2, 3};print(s1.isEmpty); //falseprint(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不变**```dartvar 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。**原数组不变**```dartvar 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)); //trueprint(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// retainAllvar s1 = {1, 2, 3, 4, 5};s1.retainAll({1, 3}); //只保留{1, 3}print(s1); //{1, 3}// retainWherevar 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 查询元素按对象查询,返回查找的对象。```dartvar s1 = {1, 2, 3, 4, 5};print(s1.lookup(2)); //2print(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)); //3print(s1.lastWhere((item) => item > 2)); //5// 返回满足条件的第一个元素,不满足 报错// print(s1.firstWhere((item) => item > 20));// 返回满足条件的第一个元素,不满足 返回orElse方法的返回值print(s1.firstWhere((item) => item > 20, orElse: () => 10)); //10
