1

Premesis: 一致する値を持つオブジェクトを含む 2 つの arraycollections で ActionScript を使用しています...
これに対する解決策が必要です (フレームワークにそれをより適切に実行するライブラリがある場合)。

要素 A と B の 2 つのリスト (重複する値はありません) があり、それらを比較して、両方に存在するすべての要素を削除する必要があるとします。

  • A にあるが B にはないすべての要素
  • B には B にあるが A にはないすべての要素

今私はそのようなことをします:

            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++;
            }

両方の配列をサイクルし、一致が見つかった場合は、両方の配列からアイテムを削除します (ループ値を増加させないで、forサイクルが正しい方法で進行するようにします)

それを行うためのより良い(そしてCPUの消費量が少ない)方法があるかどうか(そして確かにあると思います)、私は疑問に思っていました...

4

1 に答える 1

1

リストを使用する必要があり、arraycollectionの機能が必要ない場合は、単にAS3ベクターを使用するように変換することをお勧めします。これによるパフォーマンスの向上(http://www.mikechambers.com/blog/2008/09/24/actioscript-3-vector-array-performance-comparison/)は、アレイと比較して60%です。私がかつて読んだいくつかの記事から、配列はすでにArrayCollectionsよりも3倍高速であると思います。残念ながら、このソリューションはまだ時間内にO(n ^ 2)です。

余談ですが、VectorsがArrayCollectionsよりも高速である理由は、VMに型ヒントを提供するためです。VMは、コレクション内の各オブジェクトのサイズを正確に認識し、それに基づいて最適化を実行します。

ベクトルのもう1つの最適化は、比較を行う前に、最初にデータを名前で並べ替えることです。順序付けのためにリストbの名前がリストAのさらに下に見つからない場合は、ループから抜け出すために別のチェックを追加します。

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

于 2012-03-17T11:06:04.633 に答える