App Inventor 2 列表操作进阶教程 - 去重/排序/查找

« 返回首页

概述

列表(List)是App Inventor 2中最常用的数据结构。本文介绍列表的高级操作技巧,解决用户常见需求:

  • 判断列表中有没有重复项
  • 列表去重
  • 列表排序
  • 列表查找和过滤
  • 列表交叉/差集操作

列表基础回顾

常用列表积木块

操作 积木块 说明
创建 make a list 创建列表
添加 add items to list 末尾添加元素
读取 select list item 按索引读取
长度 length of list 获取元素数量
是否在列表 is in list? 判断元素是否存在
索引 index in list 获取元素的索引
删除 remove list item 按索引删除
替换 replace list item 按索引替换

判断列表中有没有重复项

方法一:逐个比较

定义 是否有重复(列表) 返回 结果
  设 i = 1
  当 i ≤ 列表长度(列表) - 1
    设 j = i + 1
    当 j ≤ 列表长度(列表)
      如果 列表第i项(列表) = 列表第j项(列表)
        返回 true  ' 找到重复
      设 j = j + 1
    设 i = i + 1
  返回 false  ' 没有重复

方法二:利用字典去重后比较长度

定义 是否有重复(列表) 返回 结果
  设 去重后 = 列表去重(列表)
  如果 列表长度(去重后) < 列表长度(列表)
    返回 true
  否则
    返回 false

使用示例

当 按钮_检查.被点击
  设 我的列表 = ["苹果", "香蕉", "橙子", "香蕉", "葡萄"]
  如果 是否有重复(我的列表)
    标签_结果.文本 = "⚠️ 列表中有重复项"
  否则
    标签_结果.文本 = "✅ 列表中没有重复项"

列表去重

方法一:利用字典键去重(推荐)

字典的键是唯一的,可以巧妙地用来去重:

定义 列表去重(列表) 返回 结果
  设 去重列表 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表)
    设 当前项 = 列表第i项(列表)
    如果 非 (当前项 是否在 去重列表 中)
      设 去重列表 = 添加列表项(去重列表, 当前项)
    设 i = i + 1
  返回 去重列表

方法二:保持顺序的去重

定义 有序去重(列表) 返回 结果
  设 已见 = 创建空列表
  设 结果列表 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表)
    设 当前项 = 列表第i项(列表)
    如果 非 (当前项 是否在 已见 中)
      设 已见 = 添加列表项(已见, 当前项)
      设 结果列表 = 添加列表项(结果列表, 当前项)
    设 i = i + 1
  返回 结果列表

获取重复项列表

定义 获取重复项(列表) 返回 重复列表
  设 重复项 = 创建空列表
  设 已见 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表)
    设 当前项 = 列表第i项(列表)
    如果 当前项 是否在 已见 中
      如果 非 (当前项 是否在 重复项 中)
        设 重复项 = 添加列表项(重复项, 当前项)
    否则
      设 已见 = 添加列表项(已见, 当前项)
    设 i = i + 1
  返回 重复项

统计每个元素出现次数

定义 统计频次(列表) 返回 频次字典
  设 频次 = 创建空字典
  设 i = 1
  当 i ≤ 列表长度(列表)
    设 当前项 = 列表第i项(列表)
    如果 字典是否包含键(频次, 当前项)
      设 当前次数 = 从字典 频次 获取 当前项
      调用 字典.设键值(频次, 当前项, 当前次数 + 1)
    否则
      调用 字典.设键值(频次, 当前项, 1)
    设 i = i + 1
  返回 频次

列表排序

冒泡排序

定义 冒泡排序(列表) 返回 排序结果
  设 排序列表 = 复制列表(列表)
  设 n = 列表长度(排序列表)
  设 i = 1
  当 i ≤ n - 1
    设 j = 1
    当 j ≤ n - i
      如果 列表第j项(排序列表) > 列表第(j+1)项(排序列表)
        ' 交换
        设 临时 = 列表第j项(排序列表)
        调用 替换列表项(排序列表, j, 列表第(j+1)项(排序列表))
        调用 替换列表项(排序列表, j+1, 临时)
      设 j = j + 1
    设 i = i + 1
  返回 排序列表

数字排序(从小到大)

定义 数字排序(列表) 返回 排序结果
  设 排序列表 = 复制列表(列表)
  设 n = 列表长度(排序列表)
  设 i = 1
  当 i ≤ n - 1
    设 j = 1
    当 j ≤ n - i
      设 a = 文本转数字(列表第j项(排序列表))
      设 b = 文本转数字(列表第(j+1)项(排序列表))
      如果 a > b
        设 临时 = 列表第j项(排序列表)
        调用 替换列表项(排序列表, j, 列表第(j+1)项(排序列表))
        调用 替换列表项(排序列表, j+1, 临时)
      设 j = j + 1
    设 i = i + 1
  返回 排序列表

列表查找和过滤

查找所有匹配项

定义 查找全部(列表, 目标) 返回 索引列表
  设 结果 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表)
    如果 列表第i项(列表) = 目标
      设 结果 = 添加列表项(结果, i)
    设 i = i + 1
  返回 结果

按条件过滤

定义 过滤大于(列表, 阈值) 返回 结果
  设 结果 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表)
    设 值 = 文本转数字(列表第i项(列表))
    如果 值 > 阈值
      设 结果 = 添加列表项(结果, 列表第i项(列表))
    设 i = i + 1
  返回 结果

模糊搜索

定义 模糊搜索(列表, 关键字) 返回 结果
  设 结果 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表)
    设 当前项 = 列表第i项(列表)
    如果 文本是否包含(当前项, 关键字)
      设 结果 = 添加列表项(结果, 当前项)
    设 i = i + 1
  返回 结果

列表集合操作

交集(两个列表共同元素)

定义 交集(列表A, 列表B) 返回 结果
  设 结果 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表A)
    如果 列表第i项(列表A) 是否在 列表B 中
      设 结果 = 添加列表项(结果, 列表第i项(列表A))
    设 i = i + 1
  返回 列表去重(结果)

差集(在A但不在B中)

定义 差集(列表A, 列表B) 返回 结果
  设 结果 = 创建空列表
  设 i = 1
  当 i ≤ 列表长度(列表A)
    如果 非 (列表第i项(列表A) 是否在 列表B 中)
      设 结果 = 添加列表项(结果, 列表第i项(列表A))
    设 i = i + 1
  返回 结果

合并去重

定义 合并去重(列表A, 列表B) 返回 结果
  设 合并 = 合并列表(列表A, 列表B)
  返回 列表去重(合并)

实用工具函数

列表转逗号分隔文本

定义 列表转文本(列表, 分隔符) 返回 文本
  设 结果 = ""
  设 i = 1
  当 i ≤ 列表长度(列表)
    如果 i = 1
      设 结果 = 列表第i项(列表)
    否则
      设 结果 = 结果 & 分隔符 & 列表第i项(列表)
    设 i = i + 1
  返回 结果

列表最大值/最小值

定义 列表最大值(列表) 返回 最大值
  设 最大 = 文本转数字(列表第1项(列表))
  设 i = 2
  当 i ≤ 列表长度(列表)
    设 当前 = 文本转数字(列表第i项(列表))
    如果 当前 > 最大
      设 最大 = 当前
    设 i = i + 1
  返回 最大

常见问题

Q1: is in list 区分大小写吗?

是的,is in list 精确匹配,区分大小写。如果需要不区分大小写的查找:

定义 不区分大小写查找(列表, 目标) 返回 是否找到
  设 i = 1
  当 i ≤ 列表长度(列表)
    如果 转小写(列表第i项(列表)) = 转小写(目标)
      返回 true
    设 i = i + 1
  返回 false

Q2: 如何随机打乱列表?

定义 随机打乱(列表) 返回 结果
  设 结果 = 复制列表(列表)
  设 i = 列表长度(结果)
  当 i > 1
    设 j = 数学.随机整数(1, i)
    设 临时 = 列表第i项(结果)
    调用 替换列表项(结果, i, 列表第j项(结果))
    调用 替换列表项(结果, j, 临时)
    设 i = i - 1
  返回 结果

总结

操作 时间复杂度 适用场景
判断重复 O(n²) 或 O(n) 数据验证
去重 O(n²) 数据清洗
排序 O(n²) 显示排序
查找 O(n) 搜索功能
过滤 O(n) 数据筛选

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈