爲什麼我不能使用table.sort來爲關聯索引排序表?不能使用關聯索引對錶進行排序
回答
你可以連續的整數鍵唯一排序表從1開始,即列表。如果你有鍵值對的另一個表,你可以對列表和排序是:
function sortpairs(t, lt)
local u = { }
for k, v in pairs(t) do table.insert(u, { key = k, value = v }) end
table.sort(u, lt)
return u
end
當然,這是有益的,只有您提供自定義排序(lt
),它預計作爲參數鍵/值對。
這個問題在一個related question about sorting Lua tables在更大的長度討論。
因爲他們首先沒有任何順序。這就像試圖分類一個裝滿香蕉的垃圾袋。
其實,我覺得它更像是試圖挑選一個揹包滿蘋果核 –
一般來說,Lua表是純關聯數組。除了作爲Lua核心中使用的特定哈希表實現的副作用之外,沒有「自然」順序。這是有道理的,因爲任何Lua數據類型(nil
除外)的值都可以用作鍵和值;但只有字符串和數字有任何一種明智的排序,然後只在相似類型的值之間。
例如,又該此表的排序順序是:
unsortable = {
answer=42,
true="Beauty",
[function() return 17 end] = function() return 42 end,
[math.pi] = "pi",
[ {} ] = {},
12, 11, 10, 9, 8
}
它有一個字符串鍵,一個布爾鍵,一個功能鍵,一個非整數鍵,一個表鍵,五整數鍵。函數應該排在字符串之前嗎?你如何比較字符串與數字?表格應該在哪裏排序?那麼userdata
和thread
值不會出現在這張表中?
按照慣例,以1開頭的順序整數索引的值通常用作列表。一些功能和常用習語遵循這個慣例,table.sort
就是一個例子。對列表進行操作的函數通常會忽略存儲在不屬於列表的鍵處的任何值。再次,table.sort
就是一個例子:它僅對那些存儲在列表中的鍵的元素進行排序。
另一個例子是#
運營商。對於上表,#unsortable
爲5,因爲unsortable[5] ~= nil
和unsortable[6] == nil
。請注意,即使pi在3和4之間,數值索引math.pi
中存儲的值也不會被計數,因爲它不是整數。此外,其他非整數鍵都不會被統計。這意味着,簡單的for循環可以遍歷整個列表:
for i in 1,#unsortable do
print(i,unsortable[i])
end
雖然經常被寫爲
for i,v in ipairs(unsortable) do
print(i,v)
end
總之,Lua中的表是值的無序集合,各由一個鍵索引;但對於連續整數鍵在1
編輯開頭的特殊約定:對於非整體按鍵與合適的部分排序的特殊情況下,有一個變通涉及到一個單獨的索引表。所描述的以字符串值爲關鍵字的表格內容是這個技巧的一個合適的例子。
首先,以列表的形式收集新表中的密鑰。也就是說,建立一個由連續整數索引的表,從1開始,用鍵作爲值並對其進行排序。然後,使用該索引按照所需順序遍歷原始表。
例如,這裏是foreachinorder()
,它使用此技術遍歷表的所有值,並按比較函數確定的順序調用每個鍵/值對的函數。
function foreachinorder(t, f, cmp)
-- first extract a list of the keys from t
local keys = {}
for k,_ in pairs(t) do
keys[#keys+1] = k
end
-- sort the keys according to the function cmp. If cmp
-- is omitted, table.sort() defaults to the < operator
table.sort(keys,cmp)
-- finally, loop over the keys in sorted order, and operate
-- on elements of t
for _,k in ipairs(keys) do
f(k,t[k])
end
end
它構建的指數,與table.sort()
排序,然後遍歷的排序索引的每個元素,並要求每一個功能f
。函數f
傳遞了鍵和值。排序順序由傳遞給table.sort
的可選比較函數確定。這就是所謂的兩個元素進行比較(在這種情況下,密鑰表t
)和必須返回true
如果第一個小於第二個。如果省略,table.sort
使用內置<
運營商。
例如,下表給出:
t1 = {
a = 1,
b = 2,
c = 3,
}
然後foreachinorder(t1,print)
打印:
a 1 b 2 c 3
和foreachinorder(t1,print,function(a,b) return a>b end)
打印:
c 3 b 2 a 1
- 1. 使用表索引對excel表中的列進行排序vba
- 2. 使用合併對數組進行排序索引排序
- 3. 有沒有辦法使用索引對列表進行排序?
- 4. 使用python對基於索引和非索引列的表值進行排序
- 5. 使用索引進行數字排序
- 6. 在使用lucene 4.0進行索引編排時進行排序
- 7. ActiveAdmin如何使用關聯對列進行排序
- 8. 如何對關聯的表數據進行排序?
- 9. 使用dust.js對功能進行排序
- 10. 使用jquery對基於索引的div進行排序
- 11. 按索引對PagedCollectionView進行排序(使用Silverlight Datagrid)
- 12. 使用Realm和NSPredicate對數組索引進行排序
- 13. 如何使用索引對數組進行排序?
- 14. 讓MySQL使用索引進行排序,但不能在WHERE子句中使用?
- 15. 使用C++排序索引進行排序
- 16. 按R索引對索引進行排序
- 17. 使用索引對數組進行排序會導致索引太多
- 18. 如何使用Pandas對數據框索引進行重新排序/排序?
- 19. 可能使用複合索引對MySQL中的更新查詢進行排序?
- 20. 可能使用current_user對搜索結果進行排序
- 21. 使用JQuery對錶進行排序
- 22. 使用OrderBy對列表進行排序
- 23. 對列表進行排序並找出索引
- 24. 根據索引和優先級對列表數進行排序
- 25. 在Django模板中對列表進行排序和索引?
- 26. 對錶索引中的內容進行排序
- 27. 如何使用快速排序按列表中的索引進行排序
- 28. 定製javascript對象排序並保持索引關聯
- 29. 熊貓堆棧不應該對剩餘索引進行排序
- 30. 使用js腳本對引導表進行排序
使您無論是說就沒有辦法進行排序的自定義(即字符串)鍵的表???我真的很喜歡Lua,因爲這種靈活的語言,但即使蹩腳的Java或(最好的語言)C#可以做到這一點。 – mnn
帶有字符串鍵的Lua表* *不是*排序的。如果您想要訂購一組鍵值對,則可以更改該表示。 –
但後來,我無法從中獲得一個項目,因爲我要保存表項的整數索引。並且該索引將在刪除條目後發生變化... – mnn