将字符串重新分配给数组中的一组固定值

3

我有一个在Lua中的列表,它是固定格式的(来自其他地方的输入)。

例如:

a = {"apple", "apple 1", "pear", "orange", "orange 3", "kiwi", "tomato"}

我也有一个查找表,我想将这个集合规范化并发送到代码格式。注意:任何包含苹果的内容,如苹果1、苹果2等,都将被映射到与苹果相同的值。
例如:
"apple" => "RD"
"pear" => "GR"
"orange" => "OG"
"kiwi" => "GR"
"tomato" => "RD"
"banana" => "YL"
etc...

我希望您能返回一个包含所有这些替换的列表。
fruitBox = {"RD", "GR", "OG"}

我不介意fruitBox是否具有重复值,只要最简单就好,但它应该只返回在查找表和原始列表中都有表示的值。我一直试图通过匹配字符串来做到这一点,但我总是卡在如何输出代码上。我还尝试过使用string.gsub和迭代for循环,但仍然没有得到有用的结果。

1个回答

4
你需要将映射列表存储在一个(哈希)表中,并迭代第一个列表,使用来自第二个表的映射更改元素。类似于这样的代码应该可以工作:
local a = {"apple", "pear", "orange", "kiwi", "tomato"}
local map = {
  apple = "RD",
  pear = "GR",
  orange = "OG",
  kiwi = "GR",
  tomato = "RD",
  banana = "YL",
}
for index = 1, #a do
  a[index] = map[a[index]] or "missing mapping"
end

-- print results
for index = 1, #a do print(a[index]) end

这段代码给我打印出了 RD GR OG GR RD

如果你 真的 想跳过映射中不存在的元素(我不建议这样做,因为在映射或数据中查找错误将很困难),那么使用单独的表格,并在循环中使用 table.insert 而不是 a[index]... 赋值。

如果字符串中有一些非字母符号(如更新后的问题中所示),您可能希望使用gsub("%A","")或类似方法将它们删除。


这太棒了,谢谢!然而,如果字符串中有数字,它就无法工作,这对我的问题至关重要。我已经编辑了问题以添加这一点。 - Gamora
添加了以下代码:for i = 1, #a do a[i] = a[i]:gsub("%A","") end,它可以正常工作。如果您有更简洁的解决方案,请随意在您的答案中添加 :) - Gamora
@Bee,这是一个有效的评论,但它与问题无关,只会使答案变得更加复杂,所以让我们保持原样。 - Paul Kulchenko
正如我所提到的,我已经修改了答案,因为这对我所尝试的事情非常关键。你的另一个修改是将它作为表格返回,因为原始问题指定了这一点。无论如何,感谢你的帮助。 - Gamora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接