【问题标题】:Case Insensitive Associative Array Keys不区分大小写的关联数组键
【发布时间】:2012-08-05 17:17:42
【问题描述】:

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

例如:

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

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

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

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

感谢任何反馈。

【问题讨论】:

    标签: arrays lua case


    【解决方案1】:

    也许创建另一个表,将键的小写版本映射到原始表中的(可能是 0、1 或更多)混合大小写键。然后将用户输入小写并在新表中查找。

    【讨论】:

    • 这可能是您最好的选择。不幸的是,您必须循环该表一次,但随后您将获得所需的快速查找。
    【解决方案2】:

    你没有说你打算对冲突做什么(原始表包含'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 元方法来记录更新。这会增加开销,但仍然比线性搜索便宜。

    【讨论】:

    • 他确实将“string.lower(key) 指定为 string.lower(user_input 作为一种可能的解决方案”,所以影子表是一个不错的选择。
    【解决方案3】:

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

    那么你必须至少遍历一次。这是一个哈希表;没有办法让不同的字符串散列到相同的值(不改变 Lua 的核心)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多