Set是无序集合类型,Set跟List都能保存一组数据,区别就是Set的元素都是唯一的。
Set-API: https://api.dart.dev/stable/2.10.3/dart-core/Set-class.html

本节方法不全,部分方法可参考List

定义常数的 Set

  1. var s1 = const {1, 2};
  2. // s1.add(3); //报错
  3. print(s1); //{1, 2}

声明方式

  1. // 字面量
  2. var s1 = {'a', 'b'};
  3. print(s1); //{a, b}
  4. // 构造函数
  5. var s2 = new Set();
  6. s2.add('a');
  7. print(s2); //{a}

类型推断

无指定泛型

字面量方式初始为空,报错
  1. var s1 = {}; //如果为空,默认是Map,因为在作者在创建Dart语言的时候先有的Map
  2. s1.add(1); //报错

字面量方式初始不为空,有默认推断
  1. // 默认类型推断为 <String>
  2. var s1 = {'a', 'b'};
  3. s1.add('c');
  4. // s1.add(1); //报错

字面量方式,无默认推断,可添加任意类型。
  1. var s3 = {'a', 1};
  2. s3.add(true);
  3. s3.add(Symbol('a'));
  4. print(s3); //{a, 1, true, Symbol("a")}

构造函数方式,无默认推断,可添加任意类型。
  1. var s4 = new Set();
  2. s4.add(true);
  3. s4.add(Symbol('a'));
  4. print(s4); //{true, Symbol("a")}

指定泛型

字面量方式指定
  1. // 指定 int 类型
  2. var s1 = <int>{1};
  3. // Set s1 = <int>{1};
  4. // Set<int> s1 = {1};
  5. s1.add(2);
  6. s1.add('a'); //报错

构造函数方式指定
  1. // 指定 String 类型
  2. var s2 = Set<String>();
  3. // Set s2 = Set<String>();
  4. // Set<String> s2 = Set();
  5. s2.add('a');
  6. s2.add(2); //报错

属性

length、first、last

  • length 长度
  • first 第一个
  • last 最后一个
    1. var s1 = {1, 2, 3};
    2. print(s1.length); //3
    3. // print(s1[1]); //报错 无序,所以没有下标
    4. print(s1.first); //1
    5. print(s1.last); //3

isEmpty、isNotEmpty 是否为空、是否不为空

  1. var s1 = {1, 2, 3};
  2. print(s1.isEmpty); //false
  3. print(s1.isNotEmpty); //true

方法

转换

toList

  1. var s1 = {1, 2};
  2. print(s1.toList()); //[1, 2]

遍历

for 循环 不能用

for…in

  1. var s1 = {1, 2, 3};
  2. for (var v in s1) {
  3. print(v); //依次输出 1 2 3
  4. }

forEach

  1. var s1 = {1, 2, 3};
  2. s1.forEach((v) {
  3. print(v); //依次输出 1 2 3
  4. });

map

  1. var s1 = {1, 2, 3, 4};
  2. print(s1.map((v) => v * 2)); //Iterable (2, 4, 6, 8)

any、every

  • any 用于检测Set中是否有任意一个元素满足指定条件。不改变原 Set
  • every 用于检测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

  1. <a name="hsFTa"></a>
  2. ### where、whereType、singleWhere 筛选元素
  3. `where((e)=>(bool)` 根据指定参数函数筛选每个元素,符合条件的元素组成一个新的Iterable集合。**原Set不变**<br />`whereType()` 从无指定泛型的Set中,筛选出指定类型的数据,组成一个新的Iterable集合。**原Set不变**<br />`singleWhere((e)=>(bool>)` 找到那唯一满足条件的元素。**原Set不变**
  4. ```dart
  5. var s1 = {1, 2, 3, 4};
  6. print(s1.where((v) => v > 2)); //Iterable (3, 4)
  7. var s2 = {1, 2, true, 'a'};
  8. Iterable<int> s21 = s2.whereType();
  9. print(s21); //(1, 2)
  10. var s3 = {1, 2, 3, 4};
  11. print(s3.singleWhere((item) => item == 2)); //2
  12. // print(s3.singleWhere((item) => item > 10)); //报错
  13. print(s3.singleWhere((item) => item > 10, orElse: () => 40)); //40

expand 扩展

根据现有的Set,指定一个规则,生成一个新的Iterable集合。原Set不变

  1. var s1 = {1, 2, 3};
  2. 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}

  1. <a name="CzQ5q"></a>
  2. ## union 联合
  3. 联合另一个Set,返回合并后的新Set。**原数组不变**
  4. ```dart
  5. var s1 = {1, 2, 3, 4, 5};
  6. print(s1.union({2, 3, 10})); //{1, 2, 3, 4, 5, 10}
  7. print(s1); //{1, 2, 3, 4, 5}

contains、containsAll 是否包含

  • contains(item) 是否包含一个。
  • containsAll([item, item, ...]) 是否包含一组。
    1. var s1 = {1, 2, 3, 4, 5};
    2. print(s1.contains(2)); //true
    3. print(s1.containsAll([2, 4])); //true 等同于 s1.containsAll({2, 4})
    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); //{}

  1. <a name="qeRr7"></a>
  2. ## retainAll、retainWhere 保留
  3. - `retainAll()` 只保留几个,无返回。
  4. - `retainWhere()` 按条件保留,无返回。
  5. ```dart
  6. // retainAll
  7. var s1 = {1, 2, 3, 4, 5};
  8. s1.retainAll({1, 3}); //只保留{1, 3}
  9. print(s1); //{1, 3}
  10. // retainWhere
  11. var s2 = {1, 2, 3, 4, 5};
  12. s2.retainWhere((item) => item > 2); //只保留大于2的
  13. 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}

  1. <a name="g51uE"></a>
  2. ## lookup 查询元素
  3. 按对象查询,返回查找的对象。
  4. ```dart
  5. var s1 = {1, 2, 3, 4, 5};
  6. print(s1.lookup(2)); //2
  7. print(s1.lookup(20)); //null

firstWhere、lastWhere

firstWhere((e)=>(bool)) 返回第一个满足条件的元素(不是元素的index)
lastWhere((e)=>(bool)) 从后往前找,返回第一个满足条件的元素的值(不是index)

  1. var s1 = {1, 2, 3, 4, 5};
  2. print(s1.firstWhere((item) => item > 2)); //3
  3. print(s1.lastWhere((item) => item > 2)); //5
  4. // 返回满足条件的第一个元素,不满足 报错
  5. // print(s1.firstWhere((item) => item > 20));
  6. // 返回满足条件的第一个元素,不满足 返回orElse方法的返回值
  7. print(s1.firstWhere((item) => item > 20, orElse: () => 10)); //10