深入理解Dart中集合类型:Set

207 阅读3分钟

屏幕截图 2025-02-18 103730.png

一、基本概念

  • 定义Set是Dart中的一种集合数据结构,类似于数学中的集合,用于存储一组唯一的元素,不允许重复。

  • 特性

    • 无序性Set中的元素没有顺序,因此无法通过索引来访问元素。
    • 唯一性Set中的元素是唯一的,不允许存在重复的元素。

二、初始化方式

  • 字面量方式:使用大括号{}直接创建Set,并初始化元素。例如:
    Set set = {1,2,3,4,5};
  • 构造函数方式:使用Set构造函数创建空的Set。例如
    Set<int> set = Set<int>();
  • 将list转化为set:将list中的元素转化为set中的元素,可以用于去除list中的重复值
    List<int> list = [1, 2, 3, 4, 5, 4, 3];
    Set<int> set = Set<int>.of(list);

三、常用操作方法

  • 添加元素:使用add方法将元素添加到Set中。例如:
    set.add(6)
  • 删除元素:使用remove方法从Set中删除元素。例如
    set.remove(6)
  • 查找元素:使用contains方法检查Set中是否包含某个元素。例如:
if (set.contains(3)) { 
    print("Set contains 3");
}

其他常用操作

  • toList:将Set转换为List
  • isEmptyisNotEmpty:检查Set是否为空。
  • firstlast:获取Set中的第一个和最后一个元素(由于Set是无序的,因此这些方法的结果是不确定的)。
  • addAll:向Set中添加多个元素。例如:mySet.addAll([4, 5, 6]);
  • clear:清空Set中的所有元素。例如:mySet.clear();

四、集合运算

  • 并集:使用union方法返回两个Set的并集。例如:var unionSet = setA.union(setB);
  • 交集:使用intersection方法返回两个Set的交集。例如:var intersectionSet = setA.intersection(setB);
  • 差集:使用difference方法返回两个Set的差集。例如:var differenceSet = setA.difference(setB);

五、遍历操作

  • for循环遍历(不建议使用)
Set<int> set = {1,2,3,4,5};
List list = set.toList();

for(var i=0;i<=list.length-1;i++){
  print(list[i]);
}
  • for..in循环遍历
Set<int> set = {1,2,3,4,5};
for (var s in set){
  print(s);
}
  • forEach循环遍历
Set<int> set = {1,2,3,4,5};
set.forEach( (var s) => print(s));

六、实践注意

  • 删除和添加操作Set在查找、删除和添加元素上的性能通常较优,因为这些操作的时间复杂度都是O(1)。
  • 空间复杂度Set的空间复杂度为O(n),其中n为Set中元素的数量。
  • 去重Set常用于去除列表中的重复元素。例如,将列表转换为Set,然后再转换回列表,即可去除重复元素。
  • 需要唯一性的数据项集合Set可以用于处理需要唯一性的数据项集合,如标签集合、分类集合等。

七、总结

  • 无序性:由于Set是无序的,因此无法通过索引来访问元素。如果需要保持元素的顺序,应该使用List
  • 唯一性Set中的元素是唯一的,无法添加重复元素。如果需要存储重复元素,应该使用List
  • 哈希值与相等性Set使用哈希值来确定元素的唯一性和相等性。因此,在使用自定义对象时,需要正确实现对象的hashCode==方法。