2013-07-29 2 views
4

У меня есть следующая структураКак отсортировать этот стол lua?

self.modules = { 
    ["Announcements"] = { 
     priority = 0, 
     -- Tons of other attributes 
    }, 
    ["Healthbar"] = { 
     priority = 40, 
     -- Tons of other attributes 
    }, 
    ["Powerbar"] = { 
     priority = 35, 
     -- Tons of other attributes 
    }, 
} 

Мне нужно сортировать эту таблицу с помощью агентом PRIORITY DESC, другие значения не имеет значения. . Сначала заходите в панель «Здоровье», затем «Powerbar», а затем переходите ко всем остальным.

// редактируем.

Ключи должны быть сохранены.

// редактировать # 2

Найдено решение, спасибо всем вам.

local function pairsByPriority(t) 
    local registry = {} 

    for k, v in pairs(t) do 
     tinsert(registry, {k, v.priority}) 
    end 

    tsort(registry, function(a, b) return a[2] > b[2] end) 

    local i = 0 

    local iter = function() 
     i = i + 1 

     if (registry[i] ~= nil) then 
      return registry[i][1], t[registry[i][1]] 
     end 

     return nil 
    end 

    return iter 
end 
+0

Что вы подразумеваете под сортировкой? Таблицы со строковыми ключами несортированы. Чтобы отсортировать его, вам нужно будет изменить структуру данных. Каков ваш ожидаемый результат? – ahilsend

+0

Возможный дубликат [Сортировка таблицы \ [\] в Lua] (http://stackoverflow.com/questions/15706270/sort-a-table-in-lua) – ahilsend

ответ

5

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

Альтернативы создать массив, где каждый элемент представляет собой таблица, содержащая два поля (имени и приоритета) и сортировать эту таблицу вместо что-то вроде этого:

self.modulesArray = {} 

for k,v in pairs(self.modules) do 
    v.name = k --Store the key in an entry called "name" 
    table.insert(self.modulesArray, v) 
end 

table.sort(self.modulesArray, function(a,b) return a.priority > b.priority end) 

for k,v in ipairs(self.modulesArray) do 
    print (k,v.name) 
end 

Выход:

1  Healthbar  40 
2  Powerbar  35 
3  Announcements 0 
Смежные вопросы