說一下lua的table庫中比較常用的排序函式——table.sort(),第乙個引數代表要進行排序的table,第二個引數是可選的,如果沒有第二個引數,那麼這個函式就會將table元素從小到大進行排序,我主要來說一下第二個引數。
第二個引數是函式型別,這個函式接收兩個table元素,如果希望第乙個引數在排序結果中位於第二個引數前,那麼就應當返回true。那麼最直觀的理解就是看**了,如下是一種寫法
local tab =
local function comp(a,b)
return a > b
endtable.sort(tab,comp)
for i =1,#tab do
print(tab[i])
end另外一種寫法就是匿名函式寫法,比較簡單,我這裡就不上**了,有心的讀者可以自己完成。
#lua_table.sort多條件(大量條件)自定義排序
之前簡單寫了(實際上大部分都是別人的鏈結)一些關於table.sortde的簡單使用,採坑地點,常見使用等,這次就最近專案中的乙個需求來記錄一下。
##table.sort小記
1.排序的原理(快速排序)
2.排序順序的依據(return a < b 看返回結果的判斷 這個結果是小於)
3.排序的坑點(==的情況一定要返回false)
備註:如果需要自定義comp函式,copm(a,b) 如果需要a排在b的前邊,
則 comp應該返回true。
注意,對於a等於b 情況,一定要返回false。
##需求概要
既然用到這個排序函式,我們的需求肯定是跟排序有關係的,常見的排序就不用說了。
常見排序舉例:
1.單條件排序-- 哪個條件大的排在前邊
2.多條件排序(存在優先順序)
常見的2-3種條件判斷a b c條件可用簡單的三層判斷解決
先看a,a不相等 ,a大的 滿足則在前,不滿足在後
先看a,a相等,再看b條件
b條件判斷同上
我們來看乙個多種條件並且不可按照是否邏輯在區分的條件排序情況(大量情況)
現在有乙個排序規則是這樣的,需要對物品進行乙個按規則的排序。
物品有四大類,裝備型別,材料型別,血瓶型別,技能書型別
先根據是否本職業可用排序,可用裝備在上,不可用裝備在下
再根據裝備品質進行排序,品質高的在上,品質低的在下
最後根據裝備型別排序,**>胸甲>鞋子>頭盔
材料,血瓶排在可用裝備之後,先血瓶再材料,材料也根據品質排序
#需求分析
我們先來簡單分析一下物品的排序規則(實際情況我已經做了刪減,實際處理可能情況更多)
我現在的排序大種類情況是有11個大類別,每個類別下邊可能還會有巢狀2-3個條件判斷排序。
如下說思路,
針對乙個具體的我們我們首先要分析它是什麼種類的屬於,
然後針對每個種類可能又需要有單獨的排序規則(比如裝備品質,等級)
當然規則適用可能又一定的前提條件(比如可穿戴的,不可穿戴無所謂了)
簡單梳理下的基本的排序規則情況(從上到下)
本職業可用裝備 裝備等級 裝備品質
血瓶材料 按品質 高-低
不可用裝備
##思路設計
這裡我們的排序的規則是沒有規律的,所以不能用簡單的判斷直接返回結果。
首先我們需要定義不同的bool變數去區分基本的是否兩種情況(比如是否是裝備,是否可穿戴,是否是材料等)
然後我採用了乙個單獨的自定義規則索引表
用每個索引代表每種情況
比如 1 ---- 可用裝備 2------血瓶 3------- 材料 4------------不可用裝備
針對每個種類的情況我們有需要單獨進行處理
1.可用裝備 我們根據裝備品質先排序,然後根據裝備品質(常規處理)
2.血瓶 無需特殊處理
3.材料 根據材料品質
4.不可用裝備 無需特殊處理
##偽**參考
由於顯示等問題最終的結果可能是相反的請自行調整其中的判斷關係。
local sort_index =
local get_sort_index = function(item)
local id = item.drop_data.item_id
local item_index
local itemtype = commonitem.item[id].type
--first do ****** blood and material
if itemtype == const.type_blood then
item_index = sort_index.blood
return item_index
elseif itemtype == const.type_material then
item_index = sort_index.material
return item_index
endlocal playertype = heromanager.player.vocation
-- exception handling
if not playertype then
return -1
end-- equipment
local equiproletype
if equipitem.equiptemplate[id] then
equiproletype = equipitem.equiptemplate[id].vocation[1]
endif equiproletype then
if equiproletype == playertype then
item_index = sort_index.equip_yes
else
item_index = sort_index.equip_no
endreturn item_index
endreturn -1
end
local equal_sort_index = function(sorta,sortb,a,b)
if not sorta or not sortb then
return false
endif sorta ~= sortb then
return false
endlocal ida = a.id
local idb = b.id
if sorta == sort_index.equip_yes then
local qualitya = commonitem.item[ida].quality
local qualityb = commonitem.item[idb].quality
local levela = commonitem.item[ida].level
local levelb = commonitem.item[idb].level
if levela ~= levelb then
return levela < levelb
endif levela == levelb then
return qualitya > qualityb
endelseif sorta == sort_index.material then
local qualitya = commonitem.item[ida].quality
local qualityb = commonitem.item[idb].quality
if qualitya ~= qualityb then
return qualitya < qualityb
endelse
return false
endreturn false
end
–comp way
local comp_pick = function(a,b)
if a == nil or b == nil then
return false
end
local ida = a.id
local idb = b.id
-- if same item
if ida == idb then
return false
endlocal sortindexa = get_sort_index(a)
local sortindexb = get_sort_index(b)
if sortindexa == sortindexb then
-- sub case do
local result
result = equal_sort_index(sortindexa,sortindexb,a,b)
return result
else
return sortindexa > sortindexb
endreturn false
end
–use way
table.sort(this.youtable,comp_pick)
lua自定義排序函式
說一下lua的table庫中比較常用的排序函式 table.sort 第乙個引數代表要進行排序的table,第二個引數是可選的,如果沒有第二個引數,那麼這個函式就會將table元素從小到大進行排序,我主要來說一下第二個引數。第二個引數是函式型別,這個函式接收兩個table元素,如果希望第乙個引數在排...
redis自定義lua指令碼
redis底層是用c語言寫的。執行的redis命令底層是呼叫的對應的lua指令碼。下面是跟著james老師通過做自定義lua指令碼,實現限流的功能。指令碼實現的功能是 在3秒內不超過2個連線。1 lua編譯器安裝 2 lua指令碼編寫 我是在redis安裝目錄 usr local soft redi...
Lua 呼叫自定義C模組
這是 lua程式設計 中提到的,但是想成功執行,對於初學lua的確沒那麼簡單。這裡涉及如何如何生成乙個動態鏈結庫so檔案 lua5.2中匯出函式從lual register變成了lual newlib。對於具體的細節有待深入。這裡的模組名是hello lib,lua直譯器會根據名字找到對應的模組,而...