如何按照另一个字符串表中定义的顺序对字符串表进行排序(Lua)

我有两个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

点赞
stackoverflow用户1442917
stackoverflow用户1442917

你可以使用接受自定义比较器的 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)
2021-11-07 19:45:23