Luaの

2016-06-22 6 views
2
のグループAにグループBで見つかったすべての要素を削除する方法

は、グループAの値がそれ以上の要素を持っていない、のは、私は2つのグループは削除操作の後、私のLuaスクリプトLuaの

groupA = {"donkey", "goat", "eagle", "whale", "dolphine", "dog", "mosquito", ...} 
groupB = {"goat", "mosquito", "donkey"} 

で定義されているとしましょう。 " goog "、" mosquito "、および" donkey "

にあるgroupAのすべてのアイテムを削除するにはどうすればよいですか?アイテムをループしてそれぞれを比較することができますが、このタイプの問題を解決するAPIや単純な組み込みのステートメントを使用することをお勧めします。要素は、レコードのような任意の型であってもよい。

+0

「要素はレコードのような任意のタイプでもかまいません」:「深い」比較が必要なように聞こえます。そのためには、Luaの "深いコピー"を調べることができます。 –

+0

@TomBlodget私はあなたが何を意味したのか理解しています。私の意図はobject.Id()に基づいてオブジェクトをフィルタリングすることです。他のセットに一致するIDを持つすべてのオブジェクトが削除されます。 – winux

答えて

0

研究のしばらくして、グループ(またはテーブル)がグループ内の要素を別のグループから削除するために、この単純な減算がLuaで機能することがわかりました。

Ex。

groupA = groupA - groupB 
2

Luaにセット差を計算する組み込み演算子はありません。あなたが記述したことを行うことができ、このプロセスをスピードアップするには、2番目のテーブルから要素のハッシュを作成し、最初のテーブルの要素を繰り返し、2番目のテーブルの要素のハッシュに存在するかどうかを確認します)。

table.removeを使用して終了すると、最初のテーブルから要素を削除するときに、最後から反復するように注意する必要があります。そうしないと、削除する要素をスキップすることがあります。

提案の一部がin this thread about set operatorsに適しているかどうかを確認することもできます。

0
local lookup = {} 
for i, v in ipairs(groupB) do 
    lookup[v] = true 
end 

local answer = {} 
for i, v in ipairs(groupA) do 
    if (not lookup[v]) then 
    table.insert(answer, v) 
    end 
end 
  • groupAルックアップテーブルで発見ないからanswerテーブルに項目を追加groupAトラバースgroupB
  • でユニークなアイテムのルックアップテーブルを作成し、
  • ルックアップテーブル内の各項目を検索

注:このアプローチでは重複は考慮されません。例えば、groupB"goat"を3回含み、groupA"goat"を4回含む場合、answerはを0回含むことになる。

+0

速いからこの答えを受け入れ、私はそのソリューションを実装するための最も簡単な方法だと思います。 – winux