1

基本的に、私はオブジェクトのテーブルを持っています。これらの各オブジェクトには、数値である特定のフィールドが 1 つあります。これらの数値エントリのいずれかが一致するかどうかを確認しようとしていますが、それを行う方法が思いつきません。1 つのループがテーブルを反復処理し、もう 1 つのループがデクリメントしている可能性があると考えましたが、ある時点で 2 つの値が 2 回比較されることはありませんか? 表面上は動いているように見えて、実は微妙な誤差があるのではないかと心配です。これは私がコードを描いた方法です:

for i = #table, 1, -1 do
    for j = 1, #table do
        if( table[i].n == table[j].n ) then
            table.insert(table2, table[i])
            table.insert(table2, table[j])
        end
    end
end

選択したオブジェクトをテーブルとして、重複することなく別の作成済みオブジェクトに挿入したいと考えています。

4

1 に答える 1

1

外側のループをテーブル上で実行し、内側のループが常に外側の要素の 1 つ前の要素から開始されるようにします。これにより、オブジェクトの二重カウントとそれ自体との比較が回避されます。また、調べたいテーブルを呼び出すと、アクセスしたいライブラリがtable非表示になる可能性があります。それでは、入力テーブルを呼び出すとしましょう:tableinsertt

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追加します。その値は、分析していたものになります。テーブルに既にある が見つかった場合は、その保存された要素と現在の要素を取得して、両方をターゲット リストに追加します。また、補助テーブルの要素を、またはテーブルではないものに置き換えます。nt[i]ntrue

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
于 2013-03-11T23:43:55.470 に答える