2013-10-03 8 views
1

можно сортировать таблицу с двумя кусками информации (имя и второй части, такие как возраст) со следующим кодом:Сортировка таблицы, содержащей таблицы

t = { 
Steve = 4, 
Derek = 1, 
Mike = 5, 
Steph = 10, 
Mary = 7, 
Danny = 2 
} 

function pairsByKeys (t,f) 
    local a = {} 

    for x in pairs (t) do 
     a[#a + 1] = x 
    end 

    table.sort(a,f) 
    local i = 0 
    return function() 
    i = i + 1 
    return a[i], t[a[i]] 
    end 
end 

for a,t in pairsByKeys (t) do 
    print (a,t) 
end 

Результат:

Danny 2 
Derek 1 
Mary 7 
Mike 5 
Steph 10 
Steve 4 

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

t = { 
    {name = "Mike", addr = "738 Rose Rd", age = 30, phone = "333-902-6543"} 
    {name = "Steph", addr = "1010 Mustang Dr", age = 28, phone = "555-842-0606"} 
    {name = "George", addr = "211 Glass St", age = 34, phone = "111-294-9903"} 
} 

Но как бы я изменить мой код, чтобы отсортировать все четыре записи (имя, адр, возраст, телефон) по возрасту и сохранить все переменные в соответствии друг с другом?

Я пытался поэкспериментировать и получаю возможность сортировать стол на pairs и лучше подумать, как выполнить table.sort. Но теперь я хочу сделать еще один шаг.

Могу ли я получить помощь от одного из гуру программирования здесь ?! Очень благодарны ребятам! Благодаря!

ответ

2

Вы можете использовать возраст как ключ вашей таблицы:

t = { 
    [30] = {name = "Mike", addr = "738 Rose Rd", age = 30, phone = "333-902-6543"}, 
    [28] = {name = "Steph", addr = "1010 Mustang Dr", age = 28, phone = "555-842-0606"}, 
    [34] = {name = "George", addr = "211 Glass St", age = 34, phone = "111-294-9903"}, 
} 

function pairsByKeys (t,f) 
    local a = {} 

    for x in pairs (t) do 
     a[#a + 1] = x 
    end 

    table.sort(a,f) 
    local i = 0 
    return function() 
     i = i + 1 
     return a[i], t[a[i]] 
    end 
end 


for a,t in pairsByKeys (t) do 
    print (t.name, t.addr, t.age, t.phone) 
end 

EDIT

В противном случае, если вы не хотите, чтобы изменить структуру t, вы можете изменить свой итератор производящая функция для отслеживания индексации:

t = { 
    {name = "Mike", addr = "738 Rose Rd", age = 30, phone = "333-902-6543"}, 
    {name = "Steph", addr = "1010 Mustang Dr", age = 28, phone = "555-842-0606"}, 
    {name = "George", addr = "211 Glass St", age = 34, phone = "111-294-9903"}, 
} 

function pairsByAgeField(t,f) 
    local a = {} 
    local index = {} 

    for _, x in pairs(t) do 
     local age = x.age 
     a[#a + 1] = age 
     index[age] = x 
    end 

    table.sort(a,f) 
    local i = 0 
    return function() 
     i = i + 1 
     return a[i], index[a[i]] 
    end 
end 


for a,t in pairsByAgeField(t) do 
    print (t.name, t.addr, t.age, t.phone) 
end 

конечно, это делает pairsByAgeField меньше гена ралли, применимой, чем ваш оригинал pairsByKeys (он предполагает, что повторяющаяся таблица имеет заданную структуру), но это не проблема, если вам часто приходится иметь дело с таблицами, такими как t в вашем приложении.

+0

Спасибо. Но как бы я установил ключи, равные «возрасту», без необходимости делать это физически? (и по какой-то причине я не могу ответить вам, @Lorenzo Donati?) – Pwrcdr87

+0

@LorenzoDonatiOk. Я просто понял, что у меня не было «local timer = os.time() repeat до os.time()> timer + 10' в конце. Оно работает! Спасибо! – Pwrcdr87

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