2013-09-26 46 views
5

Tôi đã đi qua càng nhiều câu trả lời ở đây vì tôi có thể thấy rằng có tiêu đề tôi xem xét đủ gần với vấn đề của tôi để xem xét. Tôi đã không thấy bất cứ ai có vấn đề chính xác của tôi, vì vậy tôi hỏi một câu hỏi tôi hy vọng chỉ là tôi không biết gì về một thực tế đơn giản.Bảng Lua Phân loại 2 so sánh

Tôi đang cố gắng mã hóa bảng ghi HP (int) và khoảng cách (boolean) và sau đó sắp xếp theo HP chỉ với những cái trong Phạm vi gần đầu.

local tableTest = { 
    {hp = 64, range = true, name="Frank"}, 
    {hp = 100, range = true, name="Joe"}, 
    {hp = 2, range = false, name="Jim"}, 
    {hp = 76, range = true, name="Tim"}, 
    {hp = 17, range = false, name="Jill"}, 
    {hp = 16, range = true, name="Phillip"}, 
} 

-- Sort by HP and Range to find lowest Unit in Range. 
table.sort(tableTest, function(x,y) return x.hp < y.hp and x.range end) 

for i=1, #tableTest do print(tableTest[i].name, tableTest[i].hp) end 

Kết quả của việc này là:

Phillip 16 
Jim  2 
Frank 64 
Jill 17 
Tim  76 
Joe  100 

Kết quả tôi đã mong đợi từ này sẽ là:

Phillip 16 
Frank 64 
Tim  76 
Joe  100 
Jim  2 
Jill 17 

Tôi cầu nguyện này chỉ là một sự hiểu lầm về một phần của tôi như thế nào table.sort làm việc với nhiều kiểm tra như thế này (tôi cho rằng nó gần gũi hơn với cách bạn khai báo một biến như thế này).

chỉnh sửa thông tin bổ sung - Nếu tôi thay đổi thứ tự của nơi range=false chỉ số đều nằm trong bảng, những thay đổi sản lượng cũng như (vẫn không chính xác). Các giá trị chỉ sắp xếp chúng thành các chỉ mục khác nhau sau khi sắp xếp.

Trả lời

4

Theo mô tả của bạn, chức năng đặt hàng của bạn cần so sánh range trước tiên, sau đó so sánh hp.

table.sort(tableTest, function(x,y) 
          if x.range and y.range then return x.hp < y.hp 
          elseif x.range then return true 
          elseif y.range then return false 
          else return x.hp < y.hp end 
         end) 

Có thể có một số phiên bản ngắn hơn, nhưng phiên bản này chắc chắn hoạt động và logic rõ ràng.

+0

ty ty! Tôi nghĩ rằng tôi hiểu tôi đã làm gì sai. Tôi đã suy nghĩ về sự trở lại của sự thật chỉ. Vì vậy, nếu tôi hiểu điều này đúng, tôi chỉ muốn chắc chắn rằng tôi đang đọc quyền này. Trước tiên, chúng tôi kiểm tra xem cả hai phạm vi có đúng không, sau đó chúng tôi sắp xếp theo HP. Nếu cả hai phạm vi đều không đúng, thì chúng ta sẽ thấy nếu x có một phạm vi đúng, sau đó trả về true, nếu không chúng ta sẽ thấy y có phạm vi và trả về false. Nếu cả hai đều sai, thì chúng ta sẽ sắp xếp những thứ nằm ngoài phạm vi của HP. Trường hợp tôi thất bại trong các bài kiểm tra của tôi là elseif y.range return false. Chúng tôi làm điều này để giúp y giá trị được sắp xếp đúng cách chính xác? – Bubba911

+0

@ Bubba911 Trong trường hợp đó, 'x.range' là' false' trong khi 'y.range' là' true', do đó 'x' phải sau' y' bất kể giá trị của 'hp' là gì. –

+0

Ty để làm rõ điều đó :) Tâm trí tôi vẫn quấn quanh nó. Sau khi bằng lời nói rằng tất cả nó to với bản thân mình một vài lần, những gì bạn nói là những gì tôi đã đưa ra (sau khi gửi bài). Vì vậy, thật tuyệt khi biết rằng sự hiểu biết của tôi là chính xác! Cảm ơn bạn một lần nữa, hy vọng bạn có một ngày tuyệt vời bạn tốt sir. – Bubba911

0

Bạn đã có câu trả lời cho câu hỏi này nhưng tôi nghĩ rằng nó đáng giá thêm một câu hỏi khác ở đây bao gồm cách bạn có thể giải thích về logic này dễ dàng hơn. Những ý tưởng được trình bày ở đây thực sự là ngôn ngữ bất khả tri.

Mục đích cung cấp chức năng so sánh thực sự là trả lời một câu hỏi: x có đến trước y không? Một cách khác để đặt cùng một câu hỏi là: x có mức độ ưu tiên cao hơn sau đó y? Thông thường, bạn thực hiện điều này với cùng một thuộc tính đặt hàng như nói toán tử <.

Vì vậy, chức năng của bạn nên quay lại truechỉ khi x chắc chắn trước y. Trong trường hợp của bạn, bạn thực sự sắp xếp theo trường range trước và nếu cả hai trường hợp xảy ra là true thì hãy sử dụng trường hp làm "bộ ngắt kết nối".

Bạn có thể xây dựng một bảng sự thật ở đây để giúp bạn tìm ra cách ngắn gọn nhất để diễn tả trạng thái logic rằng sản lượng hành vi mà bạn đang tìm kiếm:

x | y | x before y? 
------------------------- 
    T | T | x.hp < y.hp 
    T | F | T 
    F | T | F 
    F | F | F 

tình trạng ban đầu của bạn x.hp < y.hp and x.range gần nhưng không hoàn toàn chính xác cho tất cả các trường hợp có thể xảy ra.

Ở trên, chúng ta thấy rằng nếu x là sai thì kết quả cuối cùng cũng sai bất kể những gì y là. Vì vậy, y chỉ được xem xét khi x là đúng. Cuối cùng, để tránh sự báo trước của tình trạng falsey trong logic ngắn mạch trong lua, chúng ta sẽ muốn x.hp < y.hp ở cuối biểu thức logic. Do đó, điều kiện hợp lý bạn đang tìm kiếm là:

return x.range and (not y.range or x.hp < y.hp) 
Các vấn đề liên quan