当前位置: 首页 > article >正文

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:适合用来表示关联数组或字典结构的数据。

http://www.kler.cn/a/503336.html

相关文章:

  • 数据挖掘实训:天气数据分析与机器学习模型构建
  • stable diffusion 量化学习笔记
  • Java内存与缓存
  • 通过Apache、Nginx限制直接访问public下的静态文件
  • 特制一个自己的UI库,只用CSS、图标、emoji图 第二版
  • git 提交命令记录
  • open3d+opencv实现矩形框裁剪点云操作(C++)
  • 【动态规划-矩阵】5.下降路径最小和
  • 蓝牙的UUID(Universally Unique Identifier,通用唯一识别码)
  • 探索深度学习:开启智能新时代
  • 信号量机制之苹果-橘子问题
  • 【汇编】x86汇编编程寄存器资源心中有数
  • vulnhub靶场【IA系列】之Tornado
  • 地瓜机器人RDK Studio使用入门教程
  • 《自动驾驶与机器人中的SLAM技术》ch10:自动驾驶车辆的实时定位系统
  • 解决 vxe-table 的下拉框、日期选择等组件被 element-plus element-ui 弹窗遮挡问题 z-index
  • es 3期 第23节-运用Pipeline实现二转聚合统计
  • 【AI日记】25.01.14
  • 【Linux】从零开始:编写你的第一个Linux进度条小程序
  • PostgreSQL技术大讲堂 - 第78讲:分布式数据库-GreenPlum应用实践
  • 实战threeJS数字孪生开源 数字工厂
  • 关于扫描模型 拓扑 和 传递贴图工作流笔记
  • python检测gitlab中某个标签在一个月内添加和移除了多少次
  • Microsoft
  • 【微信小程序】let和const-综合实训
  • 【spring mvc】文件上传、下载