2010-01-20 63 views
4

我不知道如何處理nils我的排序函數獲取。在排序函數中處理nils

當我有這個檢查它,table.sort在一些調用後崩潰。

if a == nil then 
    return false 
elseif b == nil then 
    return true 
end 

有了這個錯誤:排序無效指令功能。但根據文檔,排序函數應該返回錯誤,如果一個後面b。否則爲真。

如果我刪除刪除該代碼,它當然是索引nils崩潰。

+0

您應該發佈更多的代碼。在你的比較函數中獲得nils是可疑的。你確定問題出在那裏,而不是在附近嗎? – sbk 2010-01-21 00:04:11

回答

12

這有很少或沒有任何關係表中的值爲nil。如果比較函數本身無效,則會生成錯誤消息。從table.sort文件:

If comp is given, then it must be a function that receives two table elements, and returns true when the first is less than the second (so that not comp(a[i+1],a[i]) will be true after the sort).

換句話說,comp(a,b)一定意味着not comp(b,a)。如果這個關係不成立,那麼錯誤「用於排序的無效訂單功能」可能會上升。 (注意它可能不會在所有情況下都被提出。)

爲了更有幫助,我們真的需要看到傳遞給table.sort的整個函數。

+0

+1:在測試問題中的代碼之後,它會正確處理數組中的nil值。該問題必須在功能的其餘部分不一致。 – gwell 2010-01-26 18:28:20

+5

應該強調「comp(a,b) - >!comp(b,a)」和「comp(a,b)==!comp(b,a)」不一樣。就像在a == b的情況下一樣,其中函數在兩次調用comp()時都會返回false。 – RJFalconer 2011-07-20 14:50:11

2

把所有零值在數組的開頭:

function mycomp(a,b) 
    if a == nil and b == nil then 
     return false 
    end 
    if a == nil then 
     return true 
    end 
    if b == nil then 
     return false 
    end 
    return a < b 
    end 

把所有零值在數組的末尾:

function mycomp(a,b) 
    if a == nil and b == nil then 
    return false 
    end 
    if a == nil then 
    return false 
    end 
    if b == nil then 
    return true 
    end 
    return a < b 
end 
+0

對不起,我想我沒有解釋得很清楚:首先,桌子上沒有零。其次,table.sort並不希望在那裏有這麼多的條件,因爲當我刪除零檢查它繼續,但崩潰零。 – mnn 2010-01-20 16:44:05