Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按值的顺序迭代表_Sorting_Lua_Lua Table_Computercraft - Fatal编程技术网

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)
  • 排序、索引和其他表的组合不仅不起作用,而且使它变得非常复杂
我真的被难倒了

整理桌子

这是正确的解决方案

(抛出错误:尝试在表和表上执行\uu 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
set
sorted=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