2013-09-26 38 views
5

我已經在這裏找到了很多答案,因爲我可以找到那些標題,我認爲這些標題已經足夠接近我的問題了。我沒有看到任何人有我的確切問題,所以我問了一個問題,我希望只是我對一個簡單的事實無知。Lua表分類2比較

我試圖編寫一個記錄HP(int)和距離(布爾值)的表,然後按HP排序,只有頂部附近的範圍內的值。

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 

這個輸出是:

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

我是從這個期望的輸出是:

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

我祈禱這只是我的怎麼一部分的誤解table.sort與多個這樣的檢查一起工作(我認爲它更接近於你如何聲明這樣的變量)。

編輯 其他信息 - 如果我改變的其中range=false指標位於表中的順序,輸出的變化,以及(仍然不正確)。這些值在排序之後會自行排列成不同的索引。

回答

4

根據您的描述,您的訂單功能需要先比較range,然後比較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) 

也許有一些較短的版本,但這一個肯定有效,邏輯清晰。

+0

ty ty!我想我有點明白我做錯了什麼。我只是想回報真實的。所以如果我要正確理解這一點,我只是想確保我正在閱讀這個權利。 首先我們檢查兩個範圍是否都是真的,然後我們按HP排序。如果兩個範圍都不是真的,我們會看看x是否有一個真正的範圍,然後返回true,否則我們看看y是否具有範圍並返回false。如果兩者都是錯誤的,那麼我們會對HP以外的那些進行排序。 我在測試中失敗的地方是elseif y.range返回false。我們這樣做是爲了幫助你的價值被妥善排序嗎? – Bubba911

+0

@ Bubba911在這種情況下,'x.range'爲'false',而'y.range'爲'true',因此無論'hp'的值是多少,'x'都應該在'y'後面。 –

+0

Ty澄清:)我的思想仍然圍繞它自己。在口頭上對我自己說了幾次之後,你說的是我想到的(發佈之後)。所以我很高興聽到我的理解正確!再次感謝你,希望你有一個美好的一天,你好先生。 – Bubba911

0

你已經得到了這個問題的答案,但我認爲值得在這裏增加另一個,這包括你如何能夠更容易推理這個邏輯。這裏提出的想法真的是語言不可知的。

提供比較功能的目的實際上是回答一個問題:x來之前y?提出同樣問題的另一種方法是,x具有更高的優先順序,然後y?通常,您可以使用與運算符<相同的排序屬性來實現此功能。

所以,你的函數應該返回true只有X肯定先Ÿ。在你的情況,你真的排序range領域第一,如果他們都碰巧是然後使用hp字段作爲「打破平局」。

您可以構建一個真值表這裏幫助您找到最簡潔的方式來表達產生你要找的行爲邏輯條件:

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

你的原始狀態x.hp < y.hp and x.range接近但不完全糾正所有可能的情況。

上面我們可以看到,如果X是假,那麼最終的結果不管是什麼Ÿ是也是假的。因此僅在x爲真時才被考慮。最後,爲了避免lua邏輯短路中的虛假狀況的警告,我們希望x.hp < y.hp處於邏輯表達式的末尾。因此,您正在尋找的邏輯條件是:

return x.range and (not y.range or x.hp < y.hp)