【问题标题】:How do you return all values of an array in Lua?如何在 Lua 中返回数组的所有值?
【发布时间】:2016-07-17 09:47:30
【问题描述】:

对不起,如果这是一个愚蠢的问题,我是一个相当缺乏经验的程序员。

我正在尝试使用 Lua 返回数组中的所有值。我可以通过调用它们的索引(例如 read_data[2])返回单个元素,但由于数组中的元素数量是可变的,我不能简单地输入它。我的代码:

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 中的唯一值组成。 read_data 可以包含 1 到 16 个元素。能够看到完整的数组将帮助我继续编写代码作为故障排除技术。

谢谢,

【问题讨论】:

  • 从您的问题中不清楚从数组中返回值是什么意思。您是否尝试将数组的元素作为 Lua 多返回值返回?
  • 是的,我希望函数 readformatEvent() 在列表中返回数组 'unique_data' 的每个单独元素
  • unique_data 已经是了。好吧,除了弗朗西斯科在他的回答中指出的,你没有正确地将元素插入到数组中。除此之外,unique_data 正是您想要的。
  • 如何打印数据?如果数组中有“洞”(如果duplicate == 0 会发生这种情况),则需要使用pairs,因为返回的对象不是数组。
  • @JMR:……什么?如果您返回值的代码不知道您正在返回一个数组,那么就没有办法返回一个数组。接收方必须以不同于处理单个值的方式处理数组。如果它不是为此而编写的,那么它将无法工作。

标签: arrays lua


【解决方案1】:

您可以做什么的简短示例:

-- 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

【讨论】:

  • 谢谢。您使用对的示例是解决此问题的关键。最初,我按照您的指示进行操作,但尝试使用 ipairs,但没有成功 - 没有删除任何重复项。然后当我使用pairs 时,它完美无缺。我想我不完全明白为什么ipairs 不起作用,但无论如何谢谢。
  • @JMR ipairs 迭代表元素 t[1]、t[2]、t[3] 等。它总是从 1 开始,当第一个元素为 nil 时停止。所以你的桌子上不能有任何空隙!非数字键将被忽略。相反,pairs 遍历所有表元素。不管他们有什么钥匙。
  • 很好的解释!所以在这种情况下,当我们用 nil 替换其中一个表值时,这基本上会阻止 ipairs 检查表的其余部分是否存在重复项?
  • 是的。而对将检查剩下的每个表格元素。但你没有保证订单。所以我要做的是检查每个值。如果它不是唯一的,我将删除所有重复项和值本身。当我下次跑过桌子时,它会少一组重复。
【解决方案2】:

感谢所有帮助。这是最终工作的代码。我确定它效率不高,但我现在得到了正确的输出。

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

【讨论】:

  • 您可以在倒数第二个 for 循环中使用 table.insert(unique_data, read_data[i])。这会将 read_data[i] 附加到表中,因此您不必计算非零元素。 #unique_data 将为您提供 unique_data 中的元素数量。 (它会从 1 计数到第一个 nil。所以再次小心间隙)。对于 t = {1,2,nil,4},#t 将返回 2!
  • 那肯定会有所帮助。我的最后一个障碍是计数变量本身。在某些情况下,它似乎在计算 +1 额外增量,但在其他情况下则不然。我无法弄清楚是什么原因造成的,但我想出了一个解决方法。我现在将使用 table.insert。
  • 我更改了第二个 for 循环并使用了table.insert(unique_data, read_data[i]),它就像一个魅力。不过,我仍然遇到#unique_data 问题。当我在最终的 for 循环中使用它时,它似乎达到了比唯一数据条目的真实数量更高的值。这与我在使用 count 变量时遇到的问题相同。
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多