自学内容网 自学内容网

Flutter(Dart)的集合类型List、Set 和 Map

在 Dart(以及 Flutter)中,ListSetMap 是三种常用的集合类型,用于存储和管理多个数据项。每种类型都有其独特的特性和适用场景。下面将详细介绍这三种集合类型及其常用方法。

1. List (列表)

List 是一种有序的集合,允许重复元素,并且可以通过索引访问每个元素。它是最常用的集合类型之一,适用于需要保持元素顺序或频繁随机访问的情况。

创建 List
// 使用构造函数创建空列表
List<String> emptyList = List.empty(growable: true);

// 使用字面量语法创建列表
List<int> numbers = [1, 2, 3, 4, 5];

// 使用生成器创建列表
List<int> generatedNumbers = List.generate(5, (index) => index * 2);
常用方法
  • add(element): 向列表末尾添加一个元素。
  • addAll(iterable): 将多个元素添加到列表末尾。
  • remove(element): 移除列表中的指定元素(第一个匹配项)。
  • removeAt(index): 根据索引移除元素。
  • clear(): 清空列表中的所有元素。
  • contains(element): 检查列表是否包含某个元素。
  • indexOf(element): 返回首次出现的元素索引,若不存在则返回 -1。
  • lastIndexOf(element): 返回最后一次出现的元素索引。
  • sublist(start, [end]): 返回列表的一个子集。
  • reversed: 返回反转后的迭代器。
  • sort([compare]): 对列表进行排序,可选提供比较函数。
  • where((element) => condition): 过滤出符合条件的元素。
  • map((element) => transform): 对每个元素应用转换函数并返回新列表。
  • expand((element) => iterable): 展开每个元素为多个元素。
  • fold(initialValue, (previousValue, element) => nextValue): 累加计算。
  • reduce((value, element) => value): 类似于 fold,但不需要初始值。
  • forEach((element) => action): 对每个元素执行操作。
  • any((element) => test): 判断是否有任何元素满足条件。
  • every((element) => test): 判断所有元素是否都满足条件。
  • firstWhere((element) => test, {orElse}): 查找第一个满足条件的元素,如果找不到可以提供默认值。
  • lastWhere((element) => test, {orElse}): 查找最后一个满足条件的元素,如果找不到可以提供默认值。
  • singleWhere((element) => test, {orElse}): 查找唯一一个满足条件的元素,如果找不到或找到多个会抛出异常。
示例代码
void main() {
  List<int> numbers = [1, 2, 3, 4, 5];
  
  // 添加元素
  numbers.add(6);
  print(numbers); // 输出: [1, 2, 3, 4, 5, 6]

  // 移除元素
  numbers.remove(3);
  print(numbers); // 输出: [1, 2, 4, 5, 6]

  // 排序
  numbers.sort();
  print(numbers); // 输出: [1, 2, 4, 5, 6]

  // 过滤
  List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();
  print(evenNumbers); // 输出: [2, 4, 6]
}

2. Set (集合)

Set 是一种无序的集合,不允许重复元素。它非常适合用来去除重复项或进行集合运算(如并集、交集、差集等)。

创建 Set
// 使用构造函数创建空集合
Set<String> emptySet = Set<String>();

// 使用字面量语法创建集合
Set<int> uniqueNumbers = {1, 2, 3, 4, 5};

// 使用生成器创建集合
Set<int> generatedUniqueNumbers = Set.from(List.generate(5, (index) => index * 2));
常用方法
  • add(element): 添加一个元素(不会重复)。
  • addAll(iterable): 添加多个元素。
  • remove(element): 移除指定元素。
  • clear(): 清空集合。
  • contains(element): 检查集合是否包含某个元素。
  • union(other): 返回两个集合的并集。
  • intersection(other): 返回两个集合的交集。
  • difference(other): 返回当前集合减去另一个集合的结果。
  • lookup(element): 查找元素,如果不存在则返回 null
  • forEach((element) => action): 对每个元素执行操作。
  • map((element) => transform): 对每个元素应用转换函数并返回新集合。
  • where((element) => condition): 过滤出符合条件的元素。
示例代码
void main() {
  Set<int> setA = {1, 2, 3};
  Set<int> setB = {3, 4, 5};
  
  // 并集
  Set<int> unionSet = setA.union(setB);
  print(unionSet); // 输出: {1, 2, 3, 4, 5}

  // 交集
  Set<int> intersectionSet = setA.intersection(setB);
  print(intersectionSet); // 输出: {3}

  // 差集
  Set<int> differenceSet = setA.difference(setB);
  print(differenceSet); // 输出: {1, 2}
}

3. Map (映射表)

Map 是键值对的集合,其中每个键都是唯一的。它非常适合用来表示关联数组或字典结构的数据。

创建 Map
// 使用构造函数创建空映射表
Map<String, int> emptyMap = Map<String, int>();

// 使用字面量语法创建映射表
Map<String, int> ages = {'Alice': 30, 'Bob': 25, 'Charlie': 35};

// 使用生成器创建映射表
Map<int, String> daysOfWeek = Map.fromIterable(
  ['Monday', 'Tuesday', 'Wednesday'],
  key: (item) => ['Monday', 'Tuesday', 'Wednesday'].indexOf(item),
  value: (item) => item,
);
常用方法
  • containsKey(key): 检查映射表是否包含特定键。
  • containsValue(value): 检查映射表是否包含特定值。
  • putIfAbsent(key, () => value): 如果键不存在,则插入键值对。
  • remove(key): 移除指定键及其对应的值。
  • keys: 获取所有键的可迭代对象。
  • values: 获取所有值的可迭代对象。
  • entries: 获取键值对的可迭代对象。
  • forEach((key, value) => action): 对每个键值对执行操作。
  • map((key, value) => entry): 对每个键值对应用转换函数并返回新的映射表。
  • update(key, (value) => updatedValue, {ifAbsent}): 更新现有键的值,如果键不存在可以提供默认值。
  • clear(): 清空映射表中的所有键值对。
示例代码
void main() {
  Map<String, int> ages = {'Alice': 30, 'Bob': 25, 'Charlie': 35};
  
  // 添加或更新键值对
  ages['David'] = 28;
  print(ages); // 输出: {'Alice': 30, 'Bob': 25, 'Charlie': 35, 'David': 28}

  // 移除键值对
  ages.remove('Bob');
  print(ages); // 输出: {'Alice': 30, 'Charlie': 35, 'David': 28}

  // 遍历映射表
  ages.forEach((name, age) {
    print('$name is $age years old.');
  });
  // 输出:
  // Alice is 30 years old.
  // Charlie is 35 years old.
  // David is 28 years old.
}

总结

ListSetMap 是 Dart 中非常重要的集合类型,各自具有不同的特性和使用场景:

  • List:适合需要保持元素顺序或频繁随机访问的情况。
  • Set:适合用来去除重复项或进行集合运算。
  • Map:适合用来表示关联数组或字典结构的数据。

原文地址:https://blog.csdn.net/Joe0217/article/details/145141177

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!