2013-03-11 4 views
2

я следующую таблицу:Сортировка вложенная таблица с Lua

{ 
    STANDBY = { 
    timeout = "10", 
    mode = "0" 
    }, 
    RTP = { 
    minport = "10000", 
    maxport = "10010" 
    } 
} 

Я хочу, чтобы отсортировать их в алфавитном порядке, так что результирующая таблица должна быть чем-то вроде этого:

{ 
    RTP = { 
    maxport = "10010", 
    minport = "10000" 
    }, 
    STANDBY = { 
    mode = "0", 
    timeout = "10" 
    }, 
} 

Можете ли вы мне помочь?

+7

Это тот же стол. Ваш вопрос не имеет смысла. Нецелые ключи не имеют * имеют порядок в Lua. –

ответ

6

Процитировать сообщение Programming in Lua : 19.3.

Общей ошибкой является попытка упорядочить индексы таблицы. В таблице индексы образуют набор и не имеют никакого порядка. Если вы хотите заказать их, вы должны скопировать их в массив и затем отсортировать массив.

Если вы пересекаете таблицу с pairs(), имена отображаются в произвольном порядке. Однако вы не можете сортировать их напрямую, потому что эти имена являются ключами таблицы.

Обходное решение также упоминается на той же странице.

local tableVarName = { 
    STANDBY = { 
     timeout = "10", 
     mode = "0" 
    }, 
    RTP = { 
     minport = "10000", 
     maxport = "10010" 
    } 
} 
function pairsByKeys (t, f) 
    local a = {} 
    for n in pairs(t) do table.insert(a, n) end 
    table.sort(a, f) 
    local i = 0  -- iterator variable 
    local iter = function() -- iterator function 
    i = i + 1 
    if a[i] == nil then return nil 
    else return a[i], t[a[i]] 
    end 
    end 
    return iter 
end 
for name, line in pairsByKeys(tableVarName) do 
    print(name, line) 
end 
+0

Он печатает: 'RTP \t таблица: 0041A268 STANDBY \t стол: 0041A208', что явно не то, что ОП витает. –

+0

@EgorSkriptunoff Использование той же функции рекурсивно не так сложно. Всегда можно проверить, используя условие 'type (a) ==" table "'. – hjpotter92

Смежные вопросы