一、基本概念
-
定义:
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。isEmpty和isNotEmpty:检查Set是否为空。first和last:获取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和==方法。