|
|
做 App 的时候,你一定会遇到这样一个问题:数据太多了,变量根本管不过来。 比如一个购物清单有 20 样商品,难道要建 20 个变量?一个用户通讯录有 100 条记录,难道要写 100 个变量?当然不用。列表(Lists) 就是帮你批量管理同类数据的利器。今天这篇文章,我会把 App Inventor 2 中所有列表积木的用法掰开揉碎讲清楚,从基础创建到高级函数式操作,看完就能上手用。
一、列表是什么?为什么如此重要?
列表本质上是一个有序的数据集合。你可以把它想象成一排带编号的抽屉,每个抽屉里放一个数据项,编号从 1 开始(注意,不是从 0 开始)。
和普通变量只能存一个值不同,一个列表可以存放任意数量的数据项,而且支持混合类型——你可以在同一个列表里放文字、数字、布尔值,甚至嵌套另一个列表。这种灵活性让列表成为 App Inventor 2 中最核心的数据结构。
二、基础操作:创建与添加
1. 创建空列表
使用 创建空列表 积木,初始化一个没有任何元素的列表。通常搭配变量使用:
- 设置 global myList = [ 创建空列表 ]
复制代码
这是最常见的初始化方式,先创建空列表,再在程序运行过程中动态添加数据。
2. 创建列表
使用 创建列表 积木可以直接给定初始值。点击蓝色齿轮可以新增更多列表项槽位,这是一个块扩展(Mutator)特性。
- 设置 global colors = [ 创建列表: "红" "绿" "蓝" ]
复制代码
你甚至可以创建混合类型的列表(类似 Python 的元组 Tuple),比如:
- 设置 global userInfo = [ 创建列表: "张三" 25 true ]
复制代码
这里依次存放了字符串(姓名)、数字(年龄)、布尔值(是否会员),取出来时保持原类型不变。
3. 追加列表项
使用 追加列表项 积木,将新元素添加到列表末尾。同样是块扩展积木,点击齿轮可以一次添加多项。
- 追加列表项 到 global colors: "黄"
复制代码
三、查询操作:查找、判断与选取
1. 检查列表是否包含某对象
使用 列表中是否包含 积木,返回布尔值(true/false)。
注意:如果列表包含子列表,子列表的成员本身并不是外层列表的成员。例如列表 [1, 2, [3, 4]] 的成员是 1、2 和 [3, 4],而 3 和 4 不是该列表的直接成员。
2. 求列表长度
求列表长度 积木返回列表中的项目数,一目了然。
3. 列表是否为空
列表是否为空? 返回 true/false。这在遍历前做安全检查时非常有用,避免对空列表操作导致报错。
4. 随机选取列表项
随机选取列表项 从列表中随机返回一个元素。如果列表为空会抛出异常,所以务必先判空。
5. 求对象在列表中的位置
求对象在列表中的位置 返回元素的索引值(从 1 开始),如果不存在则返回 0。
6. 选择列表中索引值对应的列表项
这是最常用的读取操作,通过索引取出对应位置的元素:
- 选择列表项 列表: global colors, 索引: 2 返回 "绿"
复制代码
四、修改操作:插入、替换与删除
1. 在列表某个位置插入项
在列表的位置插入 将新元素插入到指定索引处,原有元素自动后移。
2. 替换列表中索引值对应的项
替换列表中索引值对应的列表项 用新值替换指定位置的旧值。
3. 删除列表中某项
删除列表中某项 根据索引移除对应元素,后续元素自动前移。
五、进阶操作:合并、复制与反转
1. 追加整个列表
将一个列表中所有项追加到另一个列表中 把第二个列表的全部元素添加到第一个列表末尾。注意这不是嵌套,而是合并。
2. 复制列表
复制列表 生成列表的深拷贝(包括所有子列表)。这在需要保留原始列表、操作副本的场景下非常关键。
避坑提示:直接用赋值 设置 listB = listA 只是引用同一个列表,修改其中一个另一个也会变!需要真正复制时务必使用 复制列表 积木。
3. 列表转置
列表转置 返回一个新列表(不改变原列表),元素顺序完全颠倒。比如 [1, 2, 3] 转置后返回 [3, 2, 1]。
六、CSV 与列表互转
App Inventor 2 提供了一组 CSV 相关积木,方便列表与文本之间的格式转换:
- 列表转换为CSV行:一维列表转CSV文本,如 [a,b,c] 变为 "a","b","c"
- CSV行转换为列表:CSV文本转一维列表,如 a,b,c 变为 ["a","b","c"]
- 列表转换为CSV表:二维列表转CSV多行文本,每个子列表变成一行
- CSV表转换为列表:CSV多行文本转二维列表,每行变成一个子列表
这在处理导入导出的表格数据时特别有用。
七、函数式操作:Map、Filter、Reduce、Sort
这是列表积木中最强大的部分,灵感来源于函数式编程。
1. 创建映射列表(Map)
对列表中每个元素应用一个表达式,生成全新的列表。使用变量名 item 引用当前元素:
- Map: [ item x 2 ] -> [1,2,3] 变为 [2,4,6]
复制代码
2. 创建过滤列表(Filter)
根据布尔表达式筛选满足条件的元素:
- Filter: [ item > 2 ] -> [1,2,3,4] 变为 [3,4]
复制代码
3. 缩减列表(Reduce)
将列表逐步合并为单个值。首次运算用初始值和第一个元素,之后用结果和下一个元素,直到结束:
- Reduce: [ result + item ], 初始值: 0 -> [1,2,3] 结果为 6
复制代码
4. 排序
App Inventor 2 提供了三种排序方式:
- 创建有序列表:通用升序排序
- 创建带比较器的有序列表:自定义 item1 和 item2 的比较规则
- 创建带键函数的有序列表:为每个元素提取排序键后排序
此外还有 列表中的最小值 和 列表中的最大值,快速获取极值。
5. 截取列表(Slice)
截取列表 通过起始索引和结束索引返回子列表(包含起始,不包含结束),和 Python 的切片概念类似。
八、键值对查找
在键值对中查找 是一个非常实用的积木,用于在「对的列表」(Pair List)中查找信息。
键值对列表格式:[[key1, value1], [key2, value2], ...]
- 在键值对中查找 关键字: "cat", 键值对列表: [["a","apple"],["cat","100"]], 未找到: "not found" -> 返回 "100"
复制代码
这种模式在解析天气预报 JSON 等实际开发场景中广泛使用。
九、实战案例
案例 1:列表遍历
遍历使用控制积木中的循环,有两种方式:
- 方式一:从列表循环(foreach)—— 不需要索引时用这个,最简洁
- 方式二:从范围循环(for range)—— 需要索引时用这个
案例 2:列表去重
原理:新建空列表,逐一取出原列表元素,判断是否已存在,不存在才添加。
- 原列表: [1, 2, 2, 3, 4, 4] -> 去重后: [1, 2, 3, 4]
复制代码
案例 3:清理列表
直接用空列表覆盖即可,简单粗暴:
- 设置 global myList = [ 创建空列表 ]
复制代码
案例 4:二维列表操作
二维列表就是「列表的列表」,例如 [["abc","123"],["xyz","456"]]。操作方式和一维列表几乎一样,区别在于取出的元素本身又是一个列表。这在解析 JSON 数据时极为常见。
总结
App Inventor 2 的列表积木覆盖了日常开发 95% 以上的数据操作需求。掌握以下要点,你就能游刃有余:
- 创建:空列表 / 带初始值列表 / 混合类型列表
- 增删改查:追加 / 插入 / 替换 / 删除 / 选取
- 函数式三件套:Map 映射、Filter 过滤、Reduce 缩减
- 排序与极值:三种排序 + 最小/最大值
- 格式转换:CSV 互转、键值对查找
- 实用技巧:复制列表防引用问题、遍历方式选择、去重方案
建议先用简单的待办清单 App 练手,把列表的增删改查全部跑通,再尝试 Map/Filter/Reduce 这些高级操作。
相关资料
列表积木完整文档
App Inventor 2 中文网
清泛IT社区 - 技术交流社区
列表排序进阶教程
觉得有用?点赞收藏,关注「App Inventor 2 中文网」,每周分享积木编程实战技巧。 |
|