2013-07-29 2 views
4

은 내가에는 우선 순위 DESC하여이 테이블을 정렬 할 필요가루아 테이블 정렬 방법?

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

다음 구조를 가지고, 다른 값은 중요하지 않습니다. 예. 건강 바 먼저, 파워 바, 그리고 다른 모든 것.

// 편집.

키를 보존해야합니다.

// 편집 # 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