集合与包

简介: 集合与包

集合

假设我们想列出一个程序源代码中所有的标识符,同时过滤掉其中的保留字。一些 C 程序员可能更倾向于使用字符串数组来表示保留字集合。然后搜索这个数组来决定某个单词是否属于该集合。为了提高搜索的速度,他们还可能会使用二叉树来表示该集合。


Lua 语言中,还可以用一种高效且简单的方式来表示这类集合,即将集合元素作为索引放在表中。那么,对于指定的元素无需再搜索表,只需用该元素检索表并检查结果是否为 nil 即可。以上述需求为例,代码形如:

reserved = {
  ["while"] = true,
  ["if"] = true,
  ["else"] = true,
  ["do"] = true
}
for w in string.gmatch(s, "[%a_][%w_]*") do
  if not reserved[w] then
    -- 不是保留字处理
  end
end


提示

在定义 reserved 时,由于 whileLua 原因的保留字,所以不能直接写成 while = true ,而应该写成 ["while"] = true


我们可以借助一个辅助函数来构造集合,使得初始化过程更清晰:

function Set(list)
  local set = {}
  for _, l in ipairs(list) do set[l] = true end
  return set
end
reserved = Set({"while", "end", "function", "local"})


我们还可以使用另一个集合来保存标识符:

local ids = {}
for w in string.gmatch(s, "[%a_][%w_]*") do
  if not reserved[w] then
    ids[w] = true
  end
end
-- 输出每一个标识符
for w in pairs(ids) do print(w) end


,也被称为多重集合,与普通集合的不同之处在于其中的元素可以出现多次。在 Lua 语言中,包的简单表示类似于此前集合的表示,只不过其中的每一个键都有一个对应的计数器。如果要插入一个元素,可以递增其计数器:

function insert (bag, element)
  bag[element] = (bag[element] or 0) + 1
end


如果要删除一个元素,可以递减其计数器:

function remove (bag, element)
  local count = bag[element]
  bag[element] = (count and count > 1) and count -1 or nil
end


只有当计数器存在其大于 0 时我们才会保留计数器。

目录
相关文章
|
4月前
|
安全 Python 容器
Python中解包元素数量匹配
【6月更文挑战第21天】
29 2
|
SQL Java API
包的使用及其创建
包的使用及其创建
63 0
|
5月前
|
Java Python
【Python • 集合】如何使复杂类型对象支持集合操作
【Python • 集合】如何使复杂类型对象支持集合操作
68 0
|
5月前
|
Java
Java【代码分享 12】判断一个集合是否包含另一个集合中的一个或多个元素 retainAll() 及其他方法
Java【代码分享 12】判断一个集合是否包含另一个集合中的一个或多个元素 retainAll() 及其他方法
213 0
|
机器学习/深度学习 数据可视化 安全
【晴川先锋队】六个项目集合
宁德核电python大赛晴川先锋队作品展示
294 0
【晴川先锋队】六个项目集合
Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组
Java8 新特性 list集合利用stream根据对象得某一属性对集合进行分组,附加8之前分组
666 4
GoogleGuava - 第 2 章 集合——强大的集合工具类:java.util.Collections中未包含的集合工具
GoogleGuava - 第 2 章 集合——强大的集合工具类:java.util.Collections中未包含的集合工具
73 0
GoogleGuava - 第 2 章 集合——强大的集合工具类:java.util.Collections中未包含的集合工具
GoogleGuava - 第 2 章 集合——集合扩展工具类
GoogleGuava - 第 2 章 集合——集合扩展工具类
85 0
GoogleGuava - 第 2 章 集合——集合扩展工具类
|
SQL 安全 Java
JDK1.8新特性(六):Stream的终极操作,轻松解决集合分组、汇总等复杂操作
本文将讲述关于Stream的终极操作,让你轻松解决集合的分组、汇总等操作,让其他同事对你刮目相看。
804 0