2

Lua で連想配列/テーブルを使用しています。大文字と小文字を区別しないユーザー入力と、大文字と小文字を区別するテーブルのキーを比較したいと思います。

元:

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

可能であれば、上記の例のように、table_entry に格納されている「world」で終わるようにしたいと考えています。

ただし、テーブル全体 (大きくなります) をループして string.lower(key) を string.lower(user_input) と比較することは避けたいと思います。

また、テーブルの作成を制御できないため、小文字/大文字のキーだけでテーブルを作成することはできません。

フィードバックをお待ちしております。

4

3 に答える 3

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
    

    を使用してルックアップします(が nil でないoriginal[mixed[userkey:lower()]]場合のみ)。mixed[...]

    このシナリオでは、適切なキーを取得すると、値が変更されても設定されます。しかし、紛失したキーを取得すると、何か高価なことをしなければならなくなります。(更新を傍受できない場合を除きます。)

元のテーブルが制御不能であり、いつ更新されたかを検出する方法がない場合は、本当に失敗しています。このシナリオでは、空のテーブルを補間し、メタメソッドとメタメソッドを使用して更新を記録しようとし__indexます__newindex。これによりオーバーヘッドが追加されますが、それでも線形検索よりも安価です。

于 2012-08-08T21:42:47.130 に答える
3

おそらく、キーの小文字バージョンを元のテーブルの大文字と小文字が混在するキー (場合によっては 0、1、またはそれ以上) にマップする別のテーブルを作成します。次に、ユーザー入力を小文字にして、新しいテーブルで検索します。

于 2012-08-08T15:12:21.397 に答える
0

テーブルの作成を制御できないため、小文字/大文字のキーのみで作成することはできません。

その後、少なくとも 1 回はトラバースする必要があります。これはハッシュテーブルです。(Lua のコアを変更せずに) 異なる文字列を同じ値にハッシュする方法はありません。

メモリが問題にならない場合は、トラバーサルを 1 回実行して新しいルックアップ テーブルを作成できます。メモリが問題になる場合は、毎回テーブル全体を反復処理する必要があります。

または、そのテーブルの作成を制御する方法を見つけてください。:)

于 2012-08-08T18:08:32.723 に答える