如何在一个表中搜索另一个表中的值?

时间:2016-05-03 07:45:28

标签: search lua lua-table

这是一个简单的脚本,我为那些知道那是什么的人写了一个oldschool MUD游戏。

基本上我正在搜索一个表(我从gmcp中读取)并尝试搜索该表上的值以查看它们中的任何一个是否与任何值相匹配另一张表格,我存储了我正在寻找的价值。

我通过简单地使用" for"成功地设法用奇异的价值来做到这一点。循环从gmcp中获取值并将其存储为变量,然后使用另一个" for"循环搜索另一个表以查看是否有任何值与变量匹配。

麻烦的是,它只适用于单个值,如果我需要在该表中检查多个值,则会错过所有其他值。

我的代码如下,

for _, v in pairs(gmcptable) do
  checkvalue = v
end
for _, v in pairs(mytable) do
  if v == checkvalue then
    echo("yay")
  else
    echo("no!")
  end
end

再次这适用于具有一个值的gmcp表,但如果更多则失败。我试过这样做,

for _, v in pairs(gmcptable) do
  checkvalue = v
  for _, v in pairs(mytable) do
    if v == checkvalue then
      echo("yay")
    else
      echo("no!")
    end
  end
end

我希望它可以设置变量,运行第二个for循环来检查变量,然后重复gmcp表上的下一个值,因为它是for循环而第二个循环在循环内,但那也没有用。我也尝试将自己的功能添加到混合中并简化它,

function searchtable(table, element)
  for _, v in pairs(table) do
    if v == element then
      return true
    else
      return false
    end
  end
end

for _, v in pairs(gmcptable) do
  if searchtable(mytable, v) == true then
    echo("yay")
  else
    echo("no!")
  end
end

那也是一个半身像...我确定我只是忽略了一些东西或者展示了我的业余爱好者,但是我已经用谷歌搜索了所有我想到的东西,但是我只是自学成才,最近才开始理解表和循环是如何工作的。希望那里的某个人能够尽快回复我的作品!

UPDATE!

@Piglet好的,gmcptable实际上是我试图简化那些能够回答编码问题的人的问题。 gmcptable实际上是我的客户通过服务器连接收到的一长串表格列表。所以实际上,我有3个表我正在解析数据。 " gmcp.Char.Items.List.items"," gmcp.Char.Items.Add"和" gmcp.Char.Items.Remove"。现在gmcp.Char.Items.List.items是我在游戏中的所有房间的列表。 gmcp.Char.Items.Add是进入房间的任何东西的列表,每当有任何东西进入房间时,除了其他玩家和gmcp.Char.Items.Remove是相同的,但是当有什么东西离开房间时发送。我尝试使用此信息创建一个定位表,该目标表会自动将所需目标添加到我的定位代码中,如果它们不在会议室中则将其删除。房间列表(gmcp.Char.Items.List)仅在我进入或退出房间时更新,可能在我看时,但是现在我假设它看起来没有更新,因为那样会是后来要解决的另一个问题。

我目前有一个简单的脚本,我的客户端ID作为触发器,当我登录有问题的游戏并且脚本定义了保存值的表时,这个设置为触发一次。我在交叉引用gmcp表时要弄清楚我想要添加到目标表中的信息,这个脚本还将目标表定义为空,这是为了确保在持续时间内会话,两个表都存在并被定义。

然后我添加了三个单独的脚本来解析三个gmcp表并确定它是否在我期望的目标表上,如果是这样添加它,或者在删除表的情况下检查它当前是否在目标表和如果是这样的话。下面我将展示我正在使用的当前脚本(自昨天以来已经改变了几次,并且可能会在我看到任何未来对此的回复之前再次更改。我还将包括一个gmcp表格问题看起来如果我目前看到我的客户发现任何错误或调试细节,我也会将其包括在内。

log on trigger

match on > ^Password correct\.     in perl regex

bashtargets = {}
bashlist = {
"a baby rat",
"a young rat",
"a rat",
"an old rat",
"a black rat"
}

(上面的触发器似乎工作正常,我可以准确打印表格)

房间里的

脚本

事件处理程序> gmcp.Char.Items.List

 for _, v in pairs(gmcp.Char.Items.List.items) do
    bashname = v.name
    bashid = v.id
    for _, v in pairs(bashlist) do
        if v == bashname then
            table.insert(bashtargets, bashid)
        end
    end
end

脚本addcheck

事件处理程序" gmcp.Char.Items.Add"

for _, v in pairs(gmcp.Char.Items.Add) do
    addname = v.name
    addid = v.id
    for _, v in pairs(bashlist) do
        if v == addname then
            table.insert(bashtargets, addid)
        end
    end
end

脚本删除检查

事件处理程序" gmcp.Char.Items.Remove"

for _, v in pairs(gmcp.Char.Items.Remove) do
    delid = v.id
    for _, v in pairs(bashtargets) do
        if v == delid then
            table.remove(bashtargets, delid)
        end
    end
end

gmcp table" gmcp.Char.Items"

{
  Remove = {
    location = "room",
    item = {
      id = "150558",
      name = "a filthy gutter mutt",
      attrib = "m"
    }
  },
  Add = {
    location = "room",
    item = {
      id = "150558",
      name = "a filthy gutter mutt",
      attrib = "m"
    }
  },
   List = {
    location = "room",
    items = {
      {
        id = "59689",
        name = "a statue of a decaying gargoyle",
        icon = "profile"
      },
      {
        id = "84988",
         name = "a gas lamp"
       },
       {
        id = "101594",
        attrib = "t",
        name = "a monolith sigil",
        icon = "rune"
      },
      {
        id = "196286",
        name = "a wooden sign"
      },
      {
        id = "166410",
        name = "Lain, the Lamplighter",
        attrib = "m"
      }
    }
  }
}

我已经多次成功解析了这些信息,所以我得到了正确的表和语法,以及gmcp所关注的内容。 使用这个我也成功地完成了一半的工作。目前设置似乎一次捕获单个目标,即使有几十个并加上那个,有时奇怪的是,由于某种原因将相同的目标添加3到5次,不知道为什么,没有能够弄明白了。

我的客户反复输出这两条错误消息,不知道如何处理它们或如何修复它们......"离开房间"和#34;进入房间"是当前分配给脚本的名称,用于在客户端的表中添加和删除数据。

[ERROR:] object:<event handler function> function:<left the room>
<Lua error:[string "return left the room"]:1: '<eof>' expected near 'the'>
[ERROR:] object:<event handler function> function:<entered the room>
<Lua error:[string "return entered the room"]:1: '<eof>' expected near 'the'>

我不知道&#39;&#39;意味着,或者为什么它的预期接近&#39;尽管如此......它还是让我头疼......

我可以通过我的客户端上的调试功能看到所有处理程序都是由服务器发送的,所以它不是gmcp ...我实际上没有看到调试功能上的任何错误(哪个btw与错误功能分开,不断提出我提到的其他两个错误。

无论如何,这是我的更新...希望能让一些人更好地处理我做错的事情,这样我就能弄清楚这一点并学到新东西。

再次感谢您的回复,特别感谢@Piglet为您解答我确实从中学到了一些新东西并认为它非常有用。

2 个答案:

答案 0 :(得分:1)

在您的第一次尝试中,您有2个独立的循环。您为gmcptable中的每个元素覆盖checkvalue。输入第二个循环后,checkvalue将在第一个循环中输入最后一个值。所以你只有一个检查值,而你只跑过你的桌子一次,因为你只跑了一次。

for _, v in pairs(gmcptable) do
  checkvalue = v
end
for _, v in pairs(mytable) do
  if v == checkvalue then
    echo("yay")
  else
    echo("no!")
  end
end

如果我理解你的问题,你的第二次尝试应该有效。 迭代gmcptable的每个元素并将其与mytable中的每个元素进行比较。因此,每当gmcptable包含一个也包含在mytable中的值时,你应该得到一个“yay”。

for _, v in pairs(gmcptable) do
  checkvalue = v
  for _, v in pairs(mytable) do
    if v == checkvalue then
      echo("yay")
    else
      echo("no!")
    end
  end
end

关于第三次使用函数的一次评论。您不应该调用参数table,因为您将无法访问函数内的全局表函数。例如,对table.sort的调用会导致错误,因为您将索引本地参数表。

答案 1 :(得分:0)

好吧所以我今晚更多地修改它并且不断得到同样的错误,最后我用Google搜索错误并且明白错误是文件错误的结束,我使用的客户端使用脚本的名称作为函数的名称,如果你没有在实际的脚本中声明它,或者至少是我对它的理解,所以我没有打扰定义函数,如果我添加了一个额外的结尾客户端抛出了另一个错误的脚本,因为它没有被定义,所以我想客户端将它自己的定义添加到函数中但是没有将它自己的结尾添加到函数中这造成了混乱。总而言之,解决方案是将每个脚本定义为一个函数,并添加另一端来关闭函数并修复问题。

再次感谢@Piglet的回答,它非常有帮助,也很准确!谢谢你的队友!