web-dev-qa-db-ja.com

配列に特定の値が含まれているかどうかを確認します

いくつかの値(int)を持つこの配列があり、ユーザーが指定した値がその文字列の値と等しいかどうかを確認したいと思います。そうであれば、「Got your string」のようなメッセージを出力します。

リストの例:

local op = {
{19},
{18},
{17}
}

if 13 == (the values from that array) then
  message
else
  other message

これをどのように行うことができますか?

14
Ether Metin

Luaには他の言語のような厳密な配列はありません-ハッシュテーブルのみがあります。 Luaのテーブルは、インデックスが数値で密集していて隙間がない場合、array-likeと見なされます。次の表のインデックスは1, 2, 3, 4になります。

local t = {'a', 'b', 'c', 'd'}

配列のようなテーブルがある場合、テーブルをloopingで特定の値が含まれているかどうかを確認できます。 for..inループと ipairs 関数を使用して、汎用関数を作成できます。

local function has_value (tab, val)
    for index, value in ipairs(tab) do
        if value == val then
            return true
        end
    end

    return false
end

if条件で上記を使用して結果を取得できます。

if has_value(arr, 'b') then
    print 'Yep'
else
    print 'Nope'
end

上記のコメントを繰り返しますが、現在のコード例は配列のような数字の表ではありません。代わりに、配列のようなテーブルを含む配列のようなテーブルで、最初のインデックスのそれぞれに番号があります。上記の関数を変更して、表示されているコードを操作し、汎用性を低くする必要があります。

local function has_value (tab, val)
    for index, value in ipairs(tab) do
        -- We grab the first index of our sub-table instead
        if value[1] == val then
            return true
        end
    end

    return false
end

Luaはそれほど大きくない複雑な言語ではなく、その構文は非常に明確です。上記の概念がまったく異質な場合は、例をコピーするだけでなく、実際の文献を読むのに時間をかける必要があります。 Luaでのプログラミング を読んで、非常に基本的なことを確実に理解することをお勧めします。これはLua 5.1を対象とした初版です。

23
Oka

また、値をインデックスに移動し、それらに真の値を割り当てることで、配列に値が存在するかどうかのチェックをより効率的にすることもできます。

次に、テーブルをチェックするときに、そのインデックスに値が存在するかどうかをチェックするだけです。最悪の場合はテーブル全体を調べる必要がないため、時間を節約できます...

ここに私が念頭に置いていた例があります:

local op = {
[19]=true,
[18]=true,
[17]=true
}


if op[19] == true then
  print("message")
else
  print("other message")
end
7

質問のopテーブルは、実際には配列の配列(テーブル)です。

テーブルに値が存在するかどうかを確認するには:

local function contains(table, val)
   for i=1,#table do
      if table[i] == val then 
         return true
      end
   end
   return false
end

local table = {1, 2, 3}
if contains(table, 3) then
   print("Value found")
end
5
Diego Pino