Dart中常用的集合类型List、Set、Map、Queue

简介: Dart中常用的集合类型List、Set、Map、Queue

Dart中常用的集合类型

  1. List:列表,有序集合,可以修改数据。Dart中List对应数组,可以通过索引访问元素。
  2. Set:集合,无序,不可重复。常用于过滤重复数据。
  3. Map:映射,键值对集合。键必须唯一,值可以重复。常用于存储关联数据。
  1. Queue:队列,先入先出的集合。

举例

List:

var list = [1, 2, 3];
list.add(4);  // [1, 2, 3, 4]
list[0];      // 1

Set:

var set = {1, 2, 3};
set.add(2);   // {1, 2, 3}  不可重复
set.add(4);   // {1, 2, 3, 4}

Map:

var map = {'a': 1, 'b': 2};
map['a'];      // 1
map['c'] = 3;  // {'a': 1, 'b': 2, 'c': 3}

Queue:

var queue = Queue();
queue.add(1);
queue.add(2);
queue.removeFirst(); // 1, 返回第一个元素 
queue.first;        // 2, 获取第一个元素

除此之外,Dart还提供了UnmodifiableListView、SplayTreeSet、LinkedHashMap等集合类型。

Dart的集合类都实现了Iterable接口,所以可以使用许多共同的方法,如forEach()、map()、where()、reduce()等。

这使得Dart的集合操作非常强大和灵活。

集合常用方法

Dart中的集合类型都实现了Iterable接口,所以拥有许多共同的方法,例如:

  • forEach(): 用于遍历集合中的每个元素,没有返回值
  • map(): 将每个元素转换为新元素,返回转换后的集合
  • where(): 过滤集合中的元素,返回符合条件的元素集合
  • reduce(): 将集合中的元素组合起来,返回一个单一结果

List例子

下面通过例子详细说明每个方法:

forEach():

var list = [1, 2, 3];
list.forEach(print); // 1  2  3

map():

map()是一个非常有用的Dart集合操作,它允许我们将一个集合中的元素按照转换函数转换为新的形式,这在数据处理和映射中有很广泛的应用。

这是将数据库查询结果映射到Dart模型对象的常用手段。

var list = [1, 2, 3];
var doubled = list.map((x) => x * 2); 
print(doubled); // [2, 4, 6]

where():

var list = [1, 2, 3, 4];
var even = list.where((x) => x % 2 == 0);
print(even); // [2, 4]

reduce():

reduce()是一个极为有用的集合方法,它的作用是:

将集合中的元素组合为一个单一结果。它通过执行一个函数来组合元素,这个函数有两个参数并返回一个新的组合结果。

其语法为:

someCollection.reduce(combineFunction)
  • someCollection是要减少的集合,可以是List、Set等
  • combineFunction是一个函数,用于组合两个元素并返回结果
  • reduce()返回最终的单一结果
    例如,数组求和可以使用reduce():
var list = [1, 2, 3];
var sum = list.reduce((a, b) => a + b);
print(sum);  // 6

这里combineFunction为(a, b) => a + b,它会先以a = 1,b = 2计算,得到结果3;

然后a = 3,b = 3得到结果6,这就是最终reduce()返回的结果。

求最大值也可以使用reduce():

var list = [5, 3, 7, 4];  
var max = list.reduce((a, b) => a > b ? a : b);
print(max); // 7

这里combineFunction通过比较a和b,返回较大者,经过多次执行最终得到最大值7。

所以,总结来说,.reduce()通过执行一个combineFunction,将集合元素两两组合,最终得到一个单一结果。

这是一个实现数组汇总的非常高效简洁的方式。

它经常用于求和、求最大/最小值、计算乘积等操作。不仅仅限于数值,也可以用于字符串的拼接等


这些方法让Dart的集合操作变得异常强大和灵活:


我们可以轻松遍历和过滤集合

将集合元素映射和转换为新元素

通过reduce()实现求和、求最大值等汇总操作

而这些方法均为Iterable的方法,所以List、Set、Map等所有集合类型都共享这些功能。它们可以帮助我们轻松处理和转换数据,实现各种复杂的业务逻辑。

Set例子

我们来看几个使用Set的例子:

forEach(): 遍历Set中的每个元素

var set = {'a', 'b', 'c'};
set.forEach(print); 
// a 
// b
// c

map(): 将每个元素转换为新元素,返回Set

var set = {1, 2, 3};
var doubled = set.map((x) => x * 2);
print(doubled); // {2, 4, 6}

where(): 过滤Set中的元素,返回符合条件的元素Set

var set = {1, 2, 3, 4};
var even = set.where((x) => x % 2 == 0);
print(even); // {2, 4}

reduce(): 对Set中的元素执行组合操作,返回一个结果

var set = {'a', 'b', 'c'};
var concat = set.reduce((x, y) => x + y);
print(concat); // abc


以上示例展示了如何对Dart的Set类型使用这些常用的集合方法。

尽管Set是无序和不可重复的,但是它同样拥有强大的集合功能,这使我们可以方便地:


遍历Set中的所有元素

过滤和转换Set中的元素

通过reduce()组合Set中的元素

事实上,由于Set实现了Iterable接口,所以它拥有与List完全相同的集合方法。


相关文章
|
3月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
88 18
你对Collection中Set、List、Map理解?
|
4月前
set集合
HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。 LinkedHashSet: LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。 TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)。
|
4月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
4月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
1月前
|
编译器 容器
哈希表模拟封装unordered_map和unordered_set
哈希表模拟封装unordered_map和unordered_set
|
1月前
|
编译器 测试技术 计算机视觉
红黑树模拟封装map和set
红黑树模拟封装map和set
|
3月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
81 20
|
4月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
43 5
|
4月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
80 3
【C++】map、set基本用法
|
5月前
|
存储 JavaScript 前端开发
Set、Map、WeakSet 和 WeakMap 的区别
在 JavaScript 中,Set 和 Map 用于存储唯一值和键值对,支持多种操作方法,如添加、删除和检查元素。WeakSet 和 WeakMap 则存储弱引用的对象,有助于防止内存泄漏,适合特定场景使用。