外側のループをテーブル上で実行し、内側のループが常に外側の要素の 1 つ前の要素から開始されるようにします。これにより、オブジェクトの二重カウントとそれ自体との比較が回避されます。また、調べたいテーブルを呼び出すと、アクセスしたいライブラリがtable
非表示になる可能性があります。それでは、入力テーブルを呼び出すとしましょう:table
insert
t
for i = 1, #t do
for j = i+1, #t do
if( t[i].n == t[j].n ) then
table.insert(table2, t[i])
table.insert(table2, t[j])
end
end
end
それでも、3 つ以上の要素が同じ値を持つn
場合、それらのいくつかを複数回追加します。別のテーブルを使用して、既に挿入した要素を覚えておくことができます。
local done = {}
for i = 1, #t do
for j = i+1, #t do
if( t[i].n == t[j].n ) then
if not done[i] then
table.insert(table2, t[i])
done[i] = true
end
if not done[j] then
table.insert(table2, t[j])
done[j] = true
end
end
end
end
これが本当にエレガントではないことは認めますが、ここで遅くなり、私の脳はよりきちんとしたアプローチを考えることを拒否します.
編集:実際には...別のテーブルを使用すると、これを単一のループに減らすことができます。new に遭遇したら、新しい値をキーとしてヘルパー テーブルにn
追加します。その値は、分析していたものになります。テーブルに既にある が見つかった場合は、その保存された要素と現在の要素を取得して、両方をターゲット リストに追加します。また、補助テーブルの要素を、またはテーブルではないものに置き換えます。n
t[i]
n
true
local temp = {}
for i = 1, #t do
local n = t[i].n
if not temp[n] then
temp[n] = t[i]
else
if type(temp[n]) == "table" then
table.insert(table2, temp[n])
temp[n] = true
end
table.insert(table2, t[i])
end
end