2014-11-17 2 views
2

Я очень новичок в Lua, поэтому, пожалуйста, будьте нежны.Lua сортировка значений таблиц в таблице

Я хочу, чтобы отсортированные результаты были основаны на ключе «ошибка». В данном примере, вывод должен быть:

c 50 70 
d 25 50 
b 30 40 
a 10 20 

Вот мой сценарий:

records = {} 

records["a"] = {["count"] = 10, ["error"] = 20} 
records["b"] = {["count"] = 30, ["error"] = 40} 
records["c"] = {["count"] = 50, ["error"] = 70} 
records["d"] = {["count"] = 25, ["error"] = 50} 

function spairs(t, order) 
    -- collect the keys 
    local keys = {} 
    for k in pairs(t) do keys[#keys+1] = k end 

    -- if order function given, sort by it by passing the table and keys a, b, 
    -- otherwise just sort the keys 
    if order then 
     table.sort(keys, function(a,b) return order(t, a, b) end) 
    else 
     table.sort(keys) 
    end 

    -- return the iterator function 
    local i = 0 
    return function() 
     i = i + 1 
     if keys[i] then 
      return keys[i], t[keys[i]] 
     end 
    end 
end 

for k, v in pairs(records) do 
    for m, n in pairs(v) do 
     for x, y in spairs(v, function(t,a,b) return t[b] < t[a] end) do 
      line = string.format("%s %5s %-10d", k, n, y) 
     end 
    end 
    print(line) 

end 

Я нашел this about sorting стол и попытался реализовать. Но это не работает, результаты не сортируются.

ответ

1

table.sort работает только в том случае, если элементы таблицы имеют интегральную индексацию. В твоем случае; когда вы пытаетесь позвонить spairs, вы на самом деле звоните table.sort на count и error индексов.

Первый раз; удалить уродливые, нерелевантные вложенные петли for..pairs. Для вашей задачи вам понадобится только spairs.

for x, y in spairs(records, function(t, a, b) return t[b].error < t[a].error end) do 
    print(x, y.count, y.error) 
end 

И все.

+0

Спасибо! Это сработало. – bichonfrise74

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