Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 不区分大小写的关联数组键_Arrays_Lua_Case - Fatal编程技术网

Arrays 不区分大小写的关联数组键

Arrays 不区分大小写的关联数组键,arrays,lua,case,Arrays,Lua,Case,我正在使用Lua中的关联数组/表。我想将不区分大小写的用户输入与表中区分大小写的键进行比较 例: 如果可能的话,我希望上面的例子以存储在table_条目中的“world”结尾 但是,我确实希望避免在整个表中循环(这将是一个很大的表),并将string.lower(key)与string.lower(user\u输入)进行比较 此外,我无法控制表的创建,因此无法仅使用小写/大写键创建表 感谢您的反馈。请创建另一个表,将该键的小写版本映射到原始表中的(可能是0、1或更多)混合大小写键。然后将用户输入

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

例:

如果可能的话,我希望上面的例子以存储在table_条目中的“world”结尾

但是,我确实希望避免在整个表中循环(这将是一个很大的表),并将string.lower(key)与string.lower(user\u输入)进行比较

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


感谢您的反馈。

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

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

那么你必须至少穿过它一次。这是一个哈希表;无法将不同的字符串散列到相同的值(不改变Lua的核心)

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


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

您没有说明您打算对冲突做什么(原始表包含
'hello'
'hello'
,具有不同的值)

你不会说原始表是否会被更新或是否已修复。如果要更新而你无法拦截更新,你就完蛋了,因为你永远不知道真相会是什么

一些想法:

  • 如果原始表永远不会更新,则可以创建一个“阴影”表,该表使用原始表的键将大小写转换为小写:

    shadow = { }
    for k, v in pairs(original) do shadow[k:lower()] = v end 
    
    mixed = { }
    for k in pairs(original) do mixed[k:lower()] = k end
    
    使用
    shadow[userkey:lower()

  • 如果要更新原始表,但大多数键都会命中,则可以构建一个大小写映射,将等效的大小写混合到任何小写:

    shadow = { }
    for k, v in pairs(original) do shadow[k:lower()] = v end 
    
    mixed = { }
    for k in pairs(original) do mixed[k:lower()] = k end
    
    使用
    original[mixed[userkey:lower()

    在这种情况下,如果您获得了一个好的密钥,即使该值已更改,您也会被设置。但是如果您获得了一个缺少的密钥,您将不得不执行一些昂贵的操作(除非您可以拦截更新)


如果原始表超出了您的控制,并且您无法检测它何时被更新,那么您就完蛋了。在这种情况下,我会尝试插入一个空表,并使用
\uuuu index
\uuu newindex
元方法来记录更新。这将增加开销,但仍然比线性sea便宜rch.

这可能是您的最佳选择。不幸的是,您必须循环表一次,然后您将从那里获得所需的快速查找。他确实指定了“string.lower(键)到string.lower(用户输入作为可能的解决方案)”,因此阴影表将是一个很好的选择。