2013-03-29 40 views
21

Tôi có một bảng Lua mà tôi đang cố sắp xếp. định dạng bảng là như sau:Sắp xếp một Bảng [] trong Lua

tableOfKills[PlayerName] = NumberOfKills 

Có nghĩa là, ví dụ, nếu tôi có một cầu thủ mang tên Robin với tổng cộng 8 kills và khác tên là Jon với tổng số 10 kills, bảng sẽ là:

tableOfKills[Robin] = 8 
tableOfKills[Jon] = 10 

Làm cách nào để sắp xếp loại bảng hiển thị số lần giết chết cao nhất trước tiên? Cảm ơn trước!

+1

thể trùng lặp của [ sao chép dữ liệu từ bảng đến antoher theo thứ tự] (http://stackoverflow.com/questions/5153642/copying-data-from-table-to-antoher-with-order) – finnw

+0

Bảng không được sắp xếp theo thứ tự mảng hay gì đó. Nó không có thứ tự biểu hiện. – texasbruce

Trả lời

65

Một bảng trong Lua là một tập hợp ánh xạ khóa-giá trị với các khóa duy nhất. Các cặp được lưu trữ theo thứ tự tùy ý và do đó bảng không được sắp xếp theo bất kỳ cách nào.

Điều bạn có thể làm là lặp lại qua bảng theo một số thứ tự. Số pairs cơ bản cho bạn không đảm bảo thứ tự mà các phím được truy cập. Đây là một phiên bản tùy biến của pairs, mà tôi gọi là spairs vì nó lặp trên bàn theo một thứ tự sắp xếp:

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 

Dưới đây là một ví dụ về sử dụng các chức năng như:

HighScore = { Robin = 8, Jon = 10, Max = 11 } 

-- basic usage, just sort by the keys 
for k,v in spairs(HighScore) do 
    print(k,v) 
end 
--> Jon  10 
--> Max  11 
--> Robin 8 

-- this uses an custom sorting function ordering by score descending 
for k,v in spairs(HighScore, function(t,a,b) return t[b] < t[a] end) do 
    print(k,v) 
end 
--> Max  11 
--> Jon  10 
--> Robin 8 
+1

Hoàn hảo. Cảm ơn bạn! – sgtaziz

+12

Rất vui được trợ giúp. Vui lòng đánh dấu câu trả lời này nếu câu trả lời phù hợp với bạn. –

+2

+1 để thực hiện trình lặp 'spairs()'. Iterator thường là một khái niệm khó giải thích cho người dùng mới, và các ví dụ được giải thích rõ ràng trong tự nhiên sẽ giúp giảm thiểu điều đó. – RBerteig

Các vấn đề liên quan