質問

テーブルに値が含まれているかどうかをチェックする方法はありますか?私は私自身の(ナイーブ)機能を持っていますが、「公式」何かがそのために存在する場合、私は不思議でしたか?以上の効率的な何か...

function table.contains(table, element)
  for _, value in pairs(table) do
    if value == element then
      return true
    end
  end
  return false
end
ちなみに、私はこの機能を使用している主な理由はありません、重複する要素を、すなわち、セットとしてのテーブルを使用することです。私が使用することができます何か他のものはありますか?

役に立ちましたか?

解決

あなたは、テーブルのキーとして値を置くことができます。たとえばます:

function addToSet(set, key)
    set[key] = true
end

function removeFromSet(set, key)
    set[key] = nil
end

function setContains(set, key)
    return set[key] ~= nil
end

より完全装備の例がありますここを。

他のヒント

もちろん

あなたの表現を考えると、行うことができるよう。ののあなたの関数は、効率的なようで、他の人が述べたように(とLuaのより古い言語で実施されているような)、あなたの本当の問題を解決するには、にあります変更表現。あなたは、テーブルを持っていて、セットをしたいときは、値としてキーとtrueとして設定された要素を使用してセットにテーブルを回します。 interjayに+1ます。

私は値を比較するための別の方法を考えることはできませんが、キーとしてセットの要素を使用する場合は、ゼロ以外に値を設定することができます。その後、テーブル全体を検索することなく、高速な検索を取得します。

私は、これは古い記事ですけど、私は後世のために何かを追加したいです。 あなたが持っている問題を処理する簡単な方法は、キーと値のため、別のテーブルを作ることです。

すなわち。あなたが同じ値を持つ2つのテーブル、一つの方向を向いて1、他のポインティングものを持っています。

function addValue(key, value)
    if (value == nil) then
        removeKey(key)
        return
    end
    _primaryTable[key] = value
    _secodaryTable[value] = key
end

function removeKey(key)
    local value = _primaryTable[key]
    if (value == nil) then
        return
    end
    _primaryTable[key] = nil
    _secondaryTable[value] = nil
end

function getValue(key)
    return _primaryTable[key]
end

function containsValue(value)
    return _secondaryTable[value] ~= nil
end

あなたはそれがキー「要素」を持っているかどうかを確認するために新しいテーブルを照会することができます。これを防ぎ、他のテーブルのすべての値を反復処理する必要がある。

それは例えば、文字列ではありませんので、あなたが実際には、キーとして「要素」を使用できないことが判明した場合、

は、その後、例えば、その上にチェックサムまたはtostringを追加し、キーとしてそれを使用します。

なぜあなたはこれをしたいですか?あなたのテーブルが非常に大きい場合は、すべての要素を反復処理するための時間の量は非常に多くの場合、それをやってからあなたを防ぐ、重要になります。それは同じオブジェクトに2つのポインタではなく、同じオブジェクトの2つのコピーを記憶するように、追加のメモリオーバーヘッドは、比較的小さいであろう。 あなたのテーブルが非常に小さい場合、それは、はるかに少ない問題ではそれがさらに速く反復するために別のマップ検索を持つことよりもかもしれInfactはなります。

質問の文言は、しかし強くおに対処するための多数のアイテムを持っていることを示唆しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top