Lua中的带余数合并表格

我有一个嵌套的表格(两级)。 我要做的是合并(平润?)子表格,并且任何重复内容都会流入新键。 因此,输入将如下所示:

t = {
  [1]  = {
    [1] = "一",
    [3] = "三"
  },
  [2] = {
    [2] = "二",
    [3] = "三"
  },
  [3] = {
    [1] = "一",
    [2] = "二",
    [4] = "四"
  }
}

输出将如下所示:

t = {
  [1] = {
    [1] = "一",
    [2] = "二",
    [3] = "三",
    [4] = "四"
  }
  [2] = {
    [1] = "一",
    [2] = "二",
    [3] = "三"
  }
}

输入表格将多达 1000 个键,因此希望能够高效地完成。

点赞
用户107090
用户107090

尝试一下:

local d={}
for k,v in pairs(t) do
    if k~=1 then
        for kk,vv in pairs(v) do
            if t[1][kk]==nil then
                t[1][kk]=vv
            else
                d[kk]=vv
            end
        end
        t[k]=nil
    end
end
t[2]=d
2016-02-24 11:14:34
用户1847592
用户1847592
local bottom, max_btm = {}, 0
-- 倒序遍历二维表 t
for top = #t, 1, -1 do
  -- 遍历每行
  for k, v in pairs(t[top]) do
    -- 获取当前列的底部位置(如果还未确定底部位置则默认为 0)
    local btm = bottom[k] or 0
    -- 如果当前位置需要向下移动
    if btm < top then
      -- 不断尝试向下移动,直到找到空位置或移动到当前行
      repeat btm = btm + 1
      until btm == top or not t[btm][k]
      -- 如果底部位置仍然没有到当前行,则将当前元素从原来的位置移到新的位置
      if btm ~= top then
        t[btm][k], t[top][k] = v -- 交换元素
      end
      bottom[k] = btm -- 更新当前列的底部位置
      max_btm = math.max(max_btm, btm) -- 更新当前已知的最大底部位置
    end
  end
  -- 如果当前行上方已知的最大底部位置小于当前行,则说明当前行上方的所有行均为空
  if max_btm < top then
    t[top] = nil -- 移除该行
  end
end
2016-02-24 18:42:53