Sorting 按值的顺序迭代表
假设我有一张这样的桌子:Sorting 按值的顺序迭代表,sorting,lua,lua-table,computercraft,Sorting,Lua,Lua Table,Computercraft,假设我有一张这样的桌子: { value = 4 }, { value = 3 }, { value = 1 }, { value = 2 } 我想迭代这个,然后按顺序打印值,输出如下: 1 2 3 4 如何做到这一点,我了解如何使用ipairs和对,以及table.sort,但这仅在使用table.insert且键有效时有效,我需要按照值的顺序对此进行循环 我尝试了一个自定义函数,但它只是以错误的顺序打印它们 我试过: 创建索引并循环 对表进行排序(抛出错误:尝试
{
value = 4
},
{
value = 3
},
{
value = 1
},
{
value = 2
}
我想迭代这个,然后按顺序打印值,输出如下:
1
2
3
4
如何做到这一点,我了解如何使用ipairs
和对
,以及table.sort
,但这仅在使用table.insert且键有效时有效,我需要按照值的顺序对此进行循环
我尝试了一个自定义函数,但它只是以错误的顺序打印它们
我试过:
- 创建索引并循环
- 对表进行排序(抛出错误:尝试在表和表上执行\uuu lt)
- 排序、索引和其他表的组合不仅不起作用,而且使它变得非常复杂
a
为了让Lua能够对值进行排序,它必须知道如何比较它们。它知道如何比较数字和字符串,但默认情况下它知道如何比较两个表。考虑这一点:
local people = {
{ name = 'fred', age = 43 },
{ name = 'ted', age = 31 },
{ name = 'ned', age = 12 },
}
如果我给别人打电话,Lua怎么知道我的意图?我不知道“年龄”或“姓名”是什么意思,也不知道我想用什么来比较。我必须告诉你
可以将一个元表添加到一个表中,该表告诉Lua什么是
。如果您想保持原始表不变,可以创建一个自定义的“按值排序”迭代器,如下所示:
local function valueSort(a,b)
return a.value < b.value;
end
function sortByValue( tbl ) -- use as iterator
-- build new table to sort
local sorted = {};
for i,v in ipairs( tbl ) do sorted[i] = v end;
-- sort new table
table.sort( sorted, valueSort );
-- return iterator
return ipairs( sorted );
end
虽然这可以确保原始表保持不变,但其缺点是每次迭代时,迭代器都必须克隆myTable
以生成新的sorted
表,然后对table.sort
进行排序
如果性能至关重要,则可以通过“缓存”由sortByValue()
迭代器完成的工作来大大加快速度。更新代码:
local resort, sorted = true;
local function valueSort(a,b)
return a.value < b.value;
end
function sortByValue( tbl ) -- use as iterator
if not sorted then -- rebuild sorted table
sorted = {};
for i,v in ipairs( tbl ) do sorted[i] = v end;
resort = true;
end
if resort then -- sort the 'sorted' table
table.sort( sorted, valueSort );
resort = false;
end
-- return iterator
return ipairs( sorted );
end
当地度假酒店,排序=true;
局部函数值排序(a,b)
返回a.value
每次在myTable
setsorted=nil
中添加或删除元素时。这让迭代器知道它需要重建已排序的
表(并重新排序)
每次更新其中一个嵌套表中的值
属性时,请设置resort=true
。这让迭代器知道它必须执行表.sort
现在,当您使用迭代器时,它将尝试重新使用缓存的sorted
表中先前排序的结果
如果找不到sorted
表(例如,在第一次使用迭代器时,或者因为您将sorted=nil
设置为强制重建),它将重建它。如果它看到它需要求助(例如,在第一次使用时,或者如果重建了sorted
表,或者如果您设置resort=true
),那么它将求助于sorted
表。您可以添加一些代码以便我们可以看到您尝试了什么吗?对不起,我在尝试后(在启动文件中)删除了它,所以不太。。。就像我说的,它不起作用,只是我在黑暗中刺伤。大部分只是循环,在循环中。。。你有没有读过一些例子?在这里,您可以找到一个在表上按顺序进行迭代的示例(有点复杂,但可能这就是您的意思?)table.sort(您的表,函数(a,b)返回a.value
@我认为我已经看到了这一点,尽管它有点太复杂,无法理解。我可能错了,但我能找到的只是排序键的方法,而不是值。
for i,v in sortByValue( myTable ) do
print(v)
end
local resort, sorted = true;
local function valueSort(a,b)
return a.value < b.value;
end
function sortByValue( tbl ) -- use as iterator
if not sorted then -- rebuild sorted table
sorted = {};
for i,v in ipairs( tbl ) do sorted[i] = v end;
resort = true;
end
if resort then -- sort the 'sorted' table
table.sort( sorted, valueSort );
resort = false;
end
-- return iterator
return ipairs( sorted );
end