У меня есть вложенная таблица (двухуровневая). Я хочу объединить (сгладить?) Подтаблицы, чтобы любые дубликаты переходили в новые ключи. Таким образом, ввод будет выглядеть так

t = {
  [1]  = {
    [1] = "One",
    [3] = "Three"
  },
  [2] = {
    [2] = "Two",
    [3] = "Three"
  },
  [3] = {
    [1] = "One",
    [2] = "Two",
    [4] = "Four"
  }
}

И результат будет выглядеть как

t = {
  [1] = {
    [1] = "One",
    [2] = "Two",
    [3] = "Three",
    [4] = "Four"
  }  
  [2] = {
    [1] = "One",
    [2] = "Two",
    [3] = "Three"
  }
}

Таблица ввода может содержать до 1000 ключей, поэтому я надеюсь, что это можно сделать эффективно.

lua
2
user142532 24 Фев 2016 в 09:11

2 ответа

Лучший ответ
local bottom, max_btm = {}, 0
for top = #t, 1, -1 do
  for k, v in pairs(t[top]) do
    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
2
Egor Skriptunoff 24 Фев 2016 в 18:42

Попробуй это:

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
2
lhf 24 Фев 2016 в 11:14