Arrays 如何在Lua中返回数组的所有值?
抱歉,如果这是一个愚蠢的问题,我是一个相当缺乏经验的程序员 我试图使用Lua返回数组中的所有值。我可以通过调用单个元素的索引(例如read_data[2])来返回它们,但是由于数组中的元素数量是可变的,所以我不能简单地将其键入。我的代码:Arrays 如何在Lua中返回数组的所有值?,arrays,lua,Arrays,Lua,抱歉,如果这是一个愚蠢的问题,我是一个相当缺乏经验的程序员 我试图使用Lua返回数组中的所有值。我可以通过调用单个元素的索引(例如read_data[2])来返回它们,但是由于数组中的元素数量是可变的,所以我不能简单地将其键入。我的代码: function readformatEvent() local read_data = {} local duplicate local unique_data = {} for i=1,16 do read_data[i] = readResu
function readformatEvent()
local read_data = {}
local duplicate
local unique_data = {}
for i=1,16 do
read_data[i] = readResult(i):readData()
end
for i=1,16 do
duplicate = 0
for j=(i+1),15 do
if read_data[i] == read_data[j] then
duplicate = 1
end
end
if duplicate == 0 then
unique_data[i] = read_data[i]
end
end
return unique_data
end
unique_data是一个数组,由数组read_data中的唯一值组成。读取数据可以由1到16个元素组成。能够看到完整的数组将有助于我继续将代码作为一种故障排除技术来编写
谢谢你,一个简短的例子,说明你可以做什么:
-- some example table
t = {1,2,4,5,1,2,7,8,5,4,9,3}
-- for every value v in t
for k,v in pairs(t) do
-- check v vs all remaining values in t
for m,w in pairs(t) do
-- but not vs v itself
if k ~= m then
-- remove any non unique values from t
if w == v then
t[m] = nil
t[k] = nil
end
end
end
end
-- print the result
for k,v in pairs(t) do
print(v)
end
您可以做的一个简短示例:
-- some example table
t = {1,2,4,5,1,2,7,8,5,4,9,3}
-- for every value v in t
for k,v in pairs(t) do
-- check v vs all remaining values in t
for m,w in pairs(t) do
-- but not vs v itself
if k ~= m then
-- remove any non unique values from t
if w == v then
t[m] = nil
t[k] = nil
end
end
end
end
-- print the result
for k,v in pairs(t) do
print(v)
end
谢谢你的帮助。下面是最终有效的代码。我肯定它效率不高,但我现在得到了正确的输出
function readformatEvent()
function readformatEvent()
local read_data = {}
local unique_data = {}
local count = 1
local output = ""
local codes = readResult():readCount()
--create array from captured read data
for i=1,16 do
read_data[i] = readResult(i):readData()
end
--turn 2nd duplicate in the array into a nil value
for k,v in pairs(read_data) do
for m,w in pairs(read_data) do
if k ~= m then
if w == v then
read_data[m] = nil
end
end
end
end
--remove the nils from the array
for i=1,16 do
if read_data[i] ~= nil then
unique_data[count] = read_data[i]
count = count+1
end
end
--output unique values in correct format
if count == 12 and codes == 16 then
count = count - 1
else
count = count - 2
end
for i=1,count-1 do
output = output..unique_data[i]..", "
end
return output..unique_data[count]
end
谢谢你的帮助。下面是最终有效的代码。我肯定它效率不高,但我现在得到了正确的输出
function readformatEvent()
function readformatEvent()
local read_data = {}
local unique_data = {}
local count = 1
local output = ""
local codes = readResult():readCount()
--create array from captured read data
for i=1,16 do
read_data[i] = readResult(i):readData()
end
--turn 2nd duplicate in the array into a nil value
for k,v in pairs(read_data) do
for m,w in pairs(read_data) do
if k ~= m then
if w == v then
read_data[m] = nil
end
end
end
end
--remove the nils from the array
for i=1,16 do
if read_data[i] ~= nil then
unique_data[count] = read_data[i]
count = count+1
end
end
--output unique values in correct format
if count == 12 and codes == 16 then
count = count - 1
else
count = count - 2
end
for i=1,count-1 do
output = output..unique_data[i]..", "
end
return output..unique_data[count]
end
您的问题不清楚从数组返回值是什么意思。是否尝试将数组的元素作为Lua多个返回值返回?是的,我希望函数readformatEvent()返回列表中数组“unique_data”的每个单独元素,这就是
unique_data
已经存在的内容。好吧,除了Francisco在他的回答中指出的,你没有正确地将元素插入数组。除此之外,unique_data
正是您想要的。您如何打印数据?如果数组中有“洞”(如果duplicate==0
),则需要使用pairs
,因为返回的对象不是数组。@JMR:。。。什么?如果返回值的代码不知道返回的是数组,则无法返回数组。接收器必须以不同于处理单个值的方式处理数组。如果它不是为此编写的,那么它就不会工作。从您的问题中不清楚从数组返回值是什么意思。是否尝试将数组的元素作为Lua多个返回值返回?是的,我希望函数readformatEvent()返回列表中数组“unique_data”的每个单独元素,这就是unique_data
已经存在的内容。好吧,除了Francisco在他的回答中指出的,你没有正确地将元素插入数组。除此之外,unique_data
正是您想要的。您如何打印数据?如果数组中有“洞”(如果duplicate==0
),则需要使用pairs
,因为返回的对象不是数组。@JMR:。。。什么?如果返回值的代码不知道返回的是数组,则无法返回数组。接收器必须以不同于处理单个值的方式处理数组。如果不是这样写的,那就没用了。谢谢。您使用pairs的示例是解决此问题的关键。最初,我按照您的指示操作,但尝试使用ipairs
,但没有成功-没有删除任何重复项。然后,当我使用配对时
工作得非常完美。我想我不完全理解为什么ipairs
不起作用,但不管怎样还是要谢谢你。@JMR ipairs迭代表元素t[1]、t[2]、t[3]等等。它总是从1开始,当第一个元素为nil时停止。所以你的桌子上不能有任何空隙!非数字键将被忽略。而是对所有表元素进行迭代。不管他们有什么钥匙。很好的解释!因此,在这种情况下,当我们将一个表值替换为nil时,这将从本质上防止IPAIR检查表的其余部分是否存在重复项?是的。而pairs将检查剩下的每个表元素。但是你没有一个有保障的命令。所以我要做的是检查每个值。如果它不是唯一的,我将删除所有重复项和值本身。下次我翻过桌子时,它会少一套副本。谢谢。您使用pairs的示例是解决此问题的关键。最初,我按照您的指示操作,但尝试使用ipairs
,但没有成功-没有删除任何重复项。然后,当我使用配对时
工作得非常完美。我想我不完全理解为什么ipairs
不起作用,但不管怎样还是要谢谢你。@JMR ipairs迭代表元素t[1]、t[2]、t[3]等等。它总是从1开始,当第一个元素为nil时停止。所以你的桌子上不能有任何空隙!非数字键将被忽略。而是对所有表元素进行迭代。不管他们有什么钥匙。很好的解释!因此,在这种情况下,当我们将一个表值替换为nil时,这将从本质上防止IPAIR检查表的其余部分是否存在重复项?是的。而pairs将检查剩下的每个表元素。但是你没有一个有保障的命令。所以我要做的是检查每个值。如果它不是唯一的,我将删除所有重复项和值本身。当我下次运行该表时,它将减少1组重复项。您可以在第二个last for循环中使用table.insert(unique_data,read_data[I])。这将把read_data[i]附加到表中,这样就不必计算非nil元素#unique_数据将提供unique_数据中的元素数。(它将从1计数到0,直到第一次达到0。因此再次注意间隙)。对于t={1,2,nil,4},#t将返回2!那肯定会有帮助的。我的最后一个障碍是计数变量本身。在某些情况下,它似乎是在计算+1额外增量,而在其他情况下则不是。我不知道是什么原因造成的,但我想出了一个解决办法。现在我将使用table.insert。我更改了第二个for循环,并使用了table.insert(unique\u data,read\u data[I])
,效果非常好。我仍然有麻烦