如何按照另一个字符串表中定义的顺序对字符串表进行排序(Lua)
2021-11-7 19:13:28
收藏:0
阅读:159
评论:1
我有两个lua表格:
OrderTbl = {'Hello', 'Question', 'Answer', 'Bye'}
UnsortedTbl = {'Question', 'Bye, 'Bye', 'Question', 'Hello', 'Something'}
如何按照OrderTbl给出的顺序对UnsortedTbl进行排序?(在OrderTbl中找不到的字段将被放置在结果表的末尾,未排序)
我已经翻译了一段来自Java的样例代码,它可以使用_numers_。这里是:
function first(arr, low, high, x, n)
if high >= low then
-- (low + high)/2
local mid = low + math.floor((high - low) / 2)
if (mid == 1 or x > arr[mid - 1]) and arr[mid] == x then
return mid
end
if x > arr[mid] then return first(arr, (mid + 1), high, x, n) end
return first(arr, low, (mid - 1), x, n)
end
return nil
end
-- 将A1排序
-- 按照A2定义的顺序
function sortAccording(A1, A2)
local m=#A1
local n=#A2
-- 临时数组用于存储A1{}的副本
-- visited{}用于标记temp{}中访问的元素。
local temp = {}
local visited = {}
for i = 1, m do
temp[i] = A1[i]
visited[i] = 0
end
-- 对temp中的元素进行排序
table.sort(temp)
-- 用于排序A1{}
local ind = 0
-- 考虑A2{}的所有元素,找到它们
-- 在temp{}中并按顺序复制到A1{}中。
for i = 1, n do
-- 找到元素A2[i]在temp中的第一个出现位置的索引
local f = first(temp, 1, m, A2[i], m+1)
-- 如果不存在,无需继续
if not f then
-- continue
else
-- 将A2[i]的所有出现次数复制到A1{}
j = f
while j < m and temp[j] == A2[i] do
A1[ind] = temp[j]
ind = ind + 1
visited[j] = 1
j = j + 1
end
end
end
-- 现在复制所有temp{}中的项目
-- 不在A2{}中存在
for i = 1, m do
if visited[i] == 0 then
ind = ind + 1
A1[ind] = temp[i]
end
end
end
function printArray(arr)
for i = 1, #arr do
print(arr[i] .. " ")
end
end
-- 驱动程序来测试上面的函数。
local A1 = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8}
local A2 = {2, 1, 4, 3, 6, 5, 8, 7}
sortAccording(A1, A2)
printArray(A1)
我不太明白如何让它使用_strings_。 你能帮我吗?
原文链接 https://stackoverflow.com/questions/69875753
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以使用接受自定义比较器的
table.sort
格式:local OrderTbl = {'Hello', 'Question', 'Answer', 'Bye'} local UnsortedTbl = {'Question', 'Bye', 'Bye', 'Question', 'Hello', 'Something', 'Else'} -- 将顺序转换为可轻易查询的哈希表 for idx, val in ipairs(OrderTbl) do OrderTbl[val] = idx end local maxIdx = #OrderTbl + 1 -- 这会标记“缺失”的元素 -- 传递一个自定义比较器来检查 OrderTbl table.sort(UnsortedTbl, function(a, b) local pa = OrderTbl[a] or maxIdx -- a 的期望索引 local pb = OrderTbl[b] or maxIdx -- b 的期望索引 if pa == pb then return a < b end -- 按名称排序 return pa < pb -- 按索引排序 end)