【问题标题】:lua refresh/replace array2dlua刷新/替换array2d
【发布时间】:2017-03-24 02:10:31
【问题描述】:

我的 array2d 有一些问题。我实际上想要计划有刷新命令。

我在 data.txt

上的数据
test1:30:1
test2:40:2

所以每当我调用函数 ReadData。它会向我的 Array2d 发送类似这样的信息:

line_data = {{"test1", "30", "1"},
             {"test2", "40", "2"}}

但问题是我每次调用该函数。它总是会添加相同的数据,当我做一些事件时,我想只是刷新或替换。 我的代码

line_data = {}

function ReadData()
    local file = io.open("data.txt", "r")
    for line in file:lines() do
        line_data[#line_data+1] = { line:match('([^:]+):(%d+):(%d+)') }
    end
end

也许你们可以帮助我解决这种情况?

【问题讨论】:

  • 这个一般不能回答。你如何获取数据?你怎么知道一条线是不是新的?我可以不由自主地想到两个简单的情况: 一个新行被简单地附加到文件中,或者您可以通过它们的开头(“标题”)来区分这些行:test1、test2、testN。是这样吗?
  • 糟糕,这是line_data = {}。实际上在开头有 null 。每当我尝试调用函数读取时,我只是将它声明为数组,以便成为一个包含值的保存数组
  • 循环上的这一行 `line_data[#line_data+1] = { line:match('([^:]+):(%d+):(%d+)') }。它将创建一个包含已按 line:match 拆分的值的数组。
  • 是的,这很清楚,它不会改变任何东西。每次调用 ReadData 时,旧数据也会被附加。正如我所说,您需要澄清在哪些情况下会出现新数据。告诉我们更多关于您的问题的信息,展示一个最低限度的工作示例。向我们展示完整的代码,除了基本的行之外,所有的代码都被删除了。现在还不清楚您何时、多久以及在什么情况下调用 ReadData。

标签: arrays multidimensional-array lua lua-table


【解决方案1】:

如果我理解正确,您将在重新读取文件后覆盖 line_data。所以我认为最好的方法是从读取函数本身获取数组并替换旧的。这是我的例子:

function ReadData(_path)
    local tmp = {}
    local file = io.open(_path, "r")
    for line in file:lines() do
        tmp[#tmp+1] = { line:match('([^:]+):(%d+):(%d+)') }
    end
    file:close()
    return tmp
end

function Array2dAsStr(_array)
    local function cutRight(_s, _i)
        _i = _i or 1
        return _s:sub(1, (_s:len())-1*_i)
    end
    local sOut = '{'
    for _, v in pairs(_array) do
        sOut = sOut..'{'
        for _, v1 in pairs(v) do
            sOut = sOut..v1..','
        end
        sOut = cutRight(sOut)..'},'
    end
    return cutRight(sOut)..'}'
end

line_data = ReadData("data.txt")
print(Array2dAsStr(line_data))

-- if you read again the file, the old stuff from line_data will overwritten
line_data = ReadData("data.txt")
print(Array2dAsStr(line_data))

【讨论】:

  • 这就是我的意思。是的,它运作良好。谢谢!
【解决方案2】:

如果您想用新数据填充现有行,那么您需要一些 id。如果该 id 只是名称,即字符串的第一部分,则更改将数据附加到数组的行:

-- old code    
-- line_data[#line_data+1] = { line:match('([^:]+):(%d+):(%d+)') }

-- new code
local name, score1, score2 = line:match('([^:]+):(%d+):(%d+)')
line_data[name] = {score1, score2}

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 2017-03-26
    • 2020-07-02
    • 2016-06-05
    • 2018-12-22
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多