排序.png
前言#
看著這漂亮的字母小石頭锅论,你一定可以猜到今天的主題讼溺,那就是排序,說起排序我們都不陌生最易,比如冒泡怒坯、歸并、選擇等等藻懒,今天講的這個函數(shù)說起來有點像像c語言里面的qsort()
函數(shù)剔猿,需要自己提供比較函數(shù),接下來我們一起來看一下嬉荆。
內(nèi)容#
table.sort()##
- 原型:table.sort (table [, comp])
- 解釋:對一個長度為
length=n
的數(shù)組table排序归敬,也就是對tab_table[1]到tab_table[n]排序,如果參數(shù)comp
不省略鄙早,則它必須是一個函數(shù)汪茧,可以接收表tab_table
的兩個元素,并且在第一個元素小于第二個元素時返回true
限番,其他情況返回false
舱污,如果省略參數(shù)comp
,則Lua彼岸準運算符operator <
將會被使用弥虐。
Usage##
- 首先新建一個文件命名為sorttest.lua然后編寫如下代碼:
local tabLanguage = {
"Lua",
"swift",
"python",
"java",
"c++",
};
print("\nLUA>>>>>>the source elements of table tabLanguage is:")
for k,v in pairs(tabLanguage) do
print(k,v)
end
-- 使用默認函數(shù)排序
table.sort(tabLanguage)
print("\nLUA>>>>>>After sort, the elements of table tabLanguage is:")
for k,v in pairs(tabLanguage) do
print(k,v)
end
-- 定義自己的比較函數(shù)
local function my_comp(element1, elemnet2)
return string.len(element1) < string.len(elemnet2)
end
-- 使用自己的比較函數(shù)排序(按字符由短到長排序)
table.sort(tabLanguage, my_comp)
print("\nLUA>>>>>>After sort using my_comp, the elements of table tabLanguage is:")
for k,v in pairs(tabLanguage) do
print(k,v)
end
-- 再定義一個自己的比較函數(shù)
local function my_comp_new(element1, elemnet2)
return element1 > elemnet2
end
-- 使用自己的比較函數(shù)排序(按字符長段排序)
table.sort(tabLanguage, my_comp_new)
print("\nLUA>>>>>>After sort using my_comp_new, the elements of table tabLanguage is:")
for k,v in pairs(tabLanguage) do
print(k,v)
end
-- 定義處理nil的函數(shù)
local function my_comp_new_with_nil(element1, elemnet2)
if element1 == nil then
return false;
end
if elemnet2 == nil then
return true;
end
return element1 > elemnet2
end
-- 創(chuàng)造一個空洞
tabLanguage[2] = nil
-- 使用默認函數(shù)排序
--table.sort(tabLanguage, my_comp_new_with_nil)
print("\nLUA>>>>>>After sort using my_comp_new_with_nil, the elements of table tabLanguage is:")
for k,v in pairs(tabLanguage) do
print(k,v)
end
- 運行結(jié)果
table_sort.png
總結(jié)#
- 當我們省略了第二個參數(shù)
comp
時扩灯,排序函數(shù)使用了默認的排序方法,看起來是按字符的ANSII碼從小到大排序的霜瘪。 - 當使用我們自己定義的函數(shù)
my_comp
時驴剔,字符串是按其長度從短到長排序的。 - 當使用我們自己定義的函數(shù)
my_comp_new
時粥庄,字符串是按默認排序的反序排列的,那是因為我們在第一個元素大于第二個元素時返回了true豺妓,與定義恰恰相反惜互,是不是很有意思。 - 當使用我們自己定義的函數(shù)
my_comp_new_with_nil
時琳拭,數(shù)組中的空值被踢掉了训堆,要注意這種情況,在函數(shù)my_comp_new_with_nil
中要明確定義元素為nil
的情況白嘁,否則程序是會直接報錯的坑鱼。 - 這個函數(shù)的排序是不穩(wěn)定的,當表中有相同的元素時,在排序后相對位置可能會改變鲁沥。(具體哪些排序是穩(wěn)定呼股,哪些排序是不穩(wěn)定的,可以通過某百科查詢)画恰。