我正在使用Lua中的关联数组/表。我想将不区分大小写的用户输入与表的区分大小写的键进行比较。
例如:
table = { ["HellO"] = "world" }
user_input = "hello"
table_entry = table[user_input]
如果可能的话,我希望像上面的例子一样以table_entry中存储的“world”结尾。
但是,我真的想避免遍历整个表(这将是很大的)并将string.lower(key)与string.lower(user_input)进行比较。
另外,我无法控制表的创建,因此我无法仅使用小写/大写键创建它。
感谢任何反馈,谢谢。
答案 0 :(得分:3)
也许创建另一个表,将表的小写版本映射到原始表中的(可能是0,1或更多)混合大小写的键。然后小写用户输入并在新表中查找。
答案 1 :(得分:3)
您没有说明您打算如何处理冲突(原始表包含'hello'
和'Hello'
,但值不同。
您没有说原始表是否会更新或是否已修复。如果要更新它并且你无法拦截更新,你就会被搞砸,因为你永远不知道真相是什么。
一些想法:
如果原始表永远不会更新,那么您可以制作一个“影子”表,使用原始粉碎的键来小写:
shadow = { }
for k, v in pairs(original) do shadow[k:lower()] = v end
使用shadow[userkey:lower()]
查找。
如果要更新原始表,但大多数键都会被点击,您可以构建一个案例映射,为任何小写提供等效的混合大小写:
mixed = { }
for k in pairs(original) do mixed[k:lower()] = k end
使用original[mixed[userkey:lower()]]
查找(仅当mixed[...]
不为零时)。
在这种情况下,如果您获得了一个好的密钥,即使值已更改,您也会被设置。但如果你得到一把丢失的钥匙,你将不得不做一些昂贵的事情。 (除非您可以拦截更新。)
如果原始表格不在您的控制和之内,您无法检测到它何时更新,那么您就完全搞定了。在这种情况下,我会尝试插入一个空表并使用__index
和__newindex
元方法来记录更新。这会增加开销,但仍然比线性搜索便宜。
答案 2 :(得分:0)
我无法控制表的创建,因此我无法仅使用小写/大写键创建它。
然后你必须至少遍历一次。这是一个哈希表;没有办法让不同的字符串散列到相同的值(不改变Lua的核心)。
如果内存不是问题,您可以执行一次遍历来创建新的查找表。如果内存是个问题,那么每次都必须遍历整个表格。
或者找到某种方法来控制该表的创建。 :)