Lua - 如何同时迭代两个表

时间:2015-07-09 13:04:17

标签: lua

对于Lua来说,我是一个新手,我很难确定如何同时迭代两个表。下面的代码展示了我想要做的事情。一些解释

我有两个字符串

  1. slug - 带有a/b/c
  2. 形式的字符串
  3. 成立 - 具有相同形式的另一个字符串,例如x/y/z
  4. 我做什么

    1. 分解/字符上的两个字符串并获取两个表。
    2. slug表进行迭代,并将其每个部分放在另一个表slugs中。

    3. 如果slug中的元素包含连字符slugs,则不会有一个条目而是两个条目。因此,如果slug是hello/world/stackoverflow将生成一个包含三个元素的slugs表:hello,world和stackoverflow

    4. 但是,hello/world/stack-overflow会生成一个包含四个元素的表:hello,world,stack和overflow。

    5. 问题

      我现在输出另一个表parts,该表在原始hold表中的条目上编入索引。没有连字符驱动的分手,一对一的对应关系和parts包含

      {a:hello,b:world,c:stackoverflow}
      

      但是,使用连字符时,hello\world\stack-overflow parts包含

      {a:hello,b:world,c:stack}
      

      溢出永远不会成功。我怀疑通过同时迭代两个表来避免这种情况。但是,我无法理解如何做到这一点。我试着按照this tutorial中的注释,但没有取得什么进展。

      在一个理想的世界中,我能够做的是即时修改hold表,以便在 c 中检测到连字符时包含{a,b,c0,c1} 在其合作伙伴中的位置,slug,表格。

      通过这种改变,输出的parts表现在将包含

      {a:hello,b:world,c0:stack,c1:overflow}
      

      我非常感谢任何帮助。我应该提一下,我使用的是Lua 5.1,没有选择升级到更新的版本。

      function explode(div,str)
       if (div=='') then return false end
       local pos,arr = 0,{};
       local part = "";
       for st,sp in function() return string.find(str,div,pos,true) end do
        part = string.sub(str,pos,st-1);
        if ((0 < string.len(part)) and ("rest" ~= part)) then
         table.insert(arr,part);
        end;
        pos = sp + 1
       end
       table.insert(arr,string.sub(str,pos))
       return arr
      end;
      
      function resolveParts(slug,holds)
       local parts,slugs = {},{};
      
       for i,s in pairs(slug) do
        if (string.find(s,'%-')) then
           s = explode('-',s);
           table.insert(slugs,s[1]);
           table.insert(slugs,s[2]);
        else
           table.insert(slugs,s);
          end;
      end;
      
      --slugs has **FOUR** elements since over-flow got broken up into two
      for i,hold in pairs(holds) do
       parts[hold] = slugs[i];
      end;
      --iterating on the "old" holds table will result in parts missing one entry
      

      端;

      local slug = explode('/',"hello/stack/over-flow");
      local holds = explode("/","a/b/c");
      --Both slug & hold are tables containing 3 elements
      local parts = resolveParts(slug,holds);
      

1 个答案:

答案 0 :(得分:1)

使用@ EtanReisner的建议,将带连字符的值保存在表格中。这样,通过在数据结构中使关系显式化,您将避免将密钥相互关联的问题,例如c0,c1。将字符串中的任何内容编码后,当您必须使用该编码关系(凌乱的杂乱代码)或者当它与不同的输入断开时(例如,hold='c/c5/a/a3'

时会遇到麻烦
 function split(str, sep)
   local parts = {} 
   for m in str:gmatch('[^'..sep..']+') do
     parts[#parts + 1] = m
   end
   return parts
end

function join(ks, vs)
  local t = {}
  for i, k in pairs(ks) do
     t[k] = vs[i]
  end
  return t
end

slugs = split('hello/stack/over-flow', '/')
holds = split('a/b/c', '/')
parts = join(holds, slugs)

-- check for hyphens and split again
for k, v in pairs(parts) do
   if v:find'-' then
     parts[k] = split(v, '-')
   end
end

-- check for table or string when using parts
for k, v in pairs(parts) do
   if type(v) == "table" then
      for i, vi in ipairs(v) do
         print(k..i, vi)
      end
   else
      print(k, v)
   end
end

输出:

b   stack
c1  over
c2  flow
a   hello