不敏感的关联数组键

时间:2012-08-08 14:50:16

标签: arrays lua case

我正在使用Lua中的关联数组/表。我想将不区分大小写的用户输入与表的区分大小写的键进行比较。

例如:

table = { ["HellO"] = "world" }
user_input = "hello"
table_entry = table[user_input]

如果可能的话,我希望像上面的例子一样以table_entry中存储的“world”结尾。

但是,我真的想避免遍历整个表(这将是很大的)并将string.lower(key)与string.lower(user_input)进行比较。

另外,我无法控制表的创建,因此我无法仅使用小写/大写键创建它。

感谢任何反馈,谢谢。

3 个答案:

答案 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的核心)。

如果内存不是问题,您可以执行一次遍历来创建新的查找表。如果内存是个问题,那么每次都必须遍历整个表格。

或者找到某种方法来控制该表的创建。 :)