1

プレゼンテーション: 私は、値が一致するオブジェクトを含む2つの配列コレクションを持つActionScriptを使用しています... 私はこのための解決策が必要ですそれ以外の場合はどんな提案も高く評価されます)。オブジェクトの配列/リスト間の検索の差を最適化する方法

要素AとBの2つのリスト(重複する値はありません)を比較し、両方を比較して両方の要素をすべて削除する必要があるとしましょう最後に私は持っている必要があります

  •   for (var i:int = 0 ; i < a.length ;) 
          { 
           var isFound:Boolean = false; 
           for (var j:int = 0 ; j < b.length ;) 
           { 
            if (a.getItemAt(i).nome == b.getItemAt(j).nome) 
            { 
             isFound = true; 
             a.removeItemAt(i); 
             b.removeItemAt(j); 
             break; 
            } 
            j++; 
           } 
           if (!isFound) 
            i++; 
          } 
    

    Iサイクル配列の両方と私は場合:AでなくBにあるすべての要素Bで

  • Bではなく

に今私はそのような何かを行います一致するものが見つかった配列の両方からアイテムを削除してループの値を増やさないようにしてください(forサイクルが正しい方法で進行します)

私はそれがあると思いますそれを行うために良い(とCPUを消費する)方法...

答えて

1

リストを使用する必要があり、arraycollectionの機能が必要ない場合は、単純にAS3ベクターを使用して変換することをお勧めします。これに基づく性能向上(http://www.mikechambers.com/blog/2008/09/24/actioscript-3-vector-array-performance-comparison/)は、アレイと比較して60%です。私はArrayが既に読んだ記事のArrayCollectionsより3倍高速だと信じています。残念ながら、この解決策はまだO(n^2)時間です。

なぜなら、ベクトルがArrayCollectionsより速い理由は、VMにタイプヒントを提供するためです。 VMは、各オブジェクトがコレクション内のどのくらいの大きさであるかを正確に把握し、それに基づいて最適化を実行します。

ベクトルのもう1つの最適化は、比較を実行する前にデータを最初にソートすることです。リストbのノームが、リストAの中で順序のせいでそれ以上見つからない場合は、ループから脱出するための別のチェックを追加します。

より高速に処理したい場合は、連想配列(as3のオブジェクト)を使用します。もちろん、これはより多くのリファクタリングの努力を必要とするかもしれません。私はobject.nomeがオブジェクトの一意の文字列/ IDだと仮定しています。 objectAとobjectBのキーとしてnomeの値を代入するだけです。このようにすることで、各リストの各要素をループして比較を行う必要はありません。

+0

あなたの返事に感謝します...私はそれを見ていきます... object.nomeをobjAとobjBのキーとして割り当てるという考え方は悪いことではありません。この方法でobjAを使用しているかどうかを簡単に確認できます。 hasPropery(value)... – Marcx

+0

ええ、ルックアップはそれを超高速にする一定の時間です! – badunk

+0

助けてくれれば私の答えは受け入れてください - ありがとう! – badunk

関連する問題