2014-10-02 5 views
2

Я просмотрел множество вопросов и результатов Google, но не смог найти решение.Сортировка таблицы Lua по ключевому слову

Я пытаюсь сортировать таблицу с помощью функции table.sort в Lua, но я не могу понять, как ее использовать.

У меня есть таблица, которая имеет ключи как случайные числовые значения. Я хочу сортировать их в порядке возрастания. Я также просмотрел страницу вики Lua, но table.sort работает только со значениями таблицы.

t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" } 

Я хочу это нравится:

t = { [7]="qwe", [23]="fgh", [223]="asd", [543]="hjk" } 
+1

Какую проблему вы действительно пытаетесь решить? – lhf

+1

Код, который вы указали, неверен Код Lua ... – lhf

+0

да, я написал это неправильно, извините за неудобства. –

ответ

3

Там нет понятия порядка в таблицах Lua: они просто наборы пар ключ-значение.

В двух таблицах ниже имеют точно такое же содержание, потому что они содержат одни и те же пары:

t = { [223] = "asd" ,[23] = "fgh",[543]="hjk",[7]="qwe"} 
t = {[7]="qwe",[23] = "fgh",[223] = "asd" ,[543]="hjk"} 
+0

Вы правы, но можем ли мы установить его в порядке возрастания, потому что, когда я сравниваю эту две таблицы, она будет отличаться, потому что когда я сравниваю первую пару значений ключа, которая будет t [223] и [7]. Если оба таблица находится в порядке возрастания, тогда я могу легко найти недостающие ключи. –

+2

Руководство [говорит] (http://www.lua.org/manual/5.2/manual.html#pdf-next): «Порядок, в котором индексы перечислены, не указывается даже для числовых индексов». Он может даже измениться с одного запуска программы на другой. – lhf

1

Что было сказано @lhf верно, ваша таблица Lua держит его содержимое в любом порядке реализации считает возможным , Однако, если вы хотите напечатать (или перебрать его) отсортированным образом, это возможно (чтобы вы могли сравнить его по элементу). Для достижения этой цели, вы можете сделать это следующим образом

for key, value in orderedPairs(mytable) do 
    print(string.format("%s:%s", key, value)) 
end 

К сожалению, orderedPairs не предусмотрено в качестве части Lua, вы можете скопировать реализацию из here хотя.

6

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

local t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" } 
local tkeys = {} 
-- populate the table that holds the keys 
for k in pairs(t) do table.insert(tkeys, k) end 
-- sort the keys 
table.sort(tkeys) 
-- use the keys to retrieve the values in the sorted order 
for _, k in ipairs(tkeys) do print(k, t[k]) end 

Это напечатает

7 qwe 
23 fgh 
223 asd 
543 hjk 

Другой вариант - предоставить ваш собственный итератор вместо pairs, чтобы перебрать таблицу в нужном вам порядке, но сортировка ключей может быть достаточно простой для ваших нужд.

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