0

数百アイテムの長さの特定のアイテムを配列から削除するにはどうすればよいですか?

-例えば:

var myArray:Array = ["dog", "cat", "bear", "duck", "frog", etc..., etc...];

この配列から「アヒル」を削除したい場合はどうすればよいですか?配列は非常に長く、「アヒル」がどこにあるかわからないため、配列内のインデックスがわからないことに注意してください。そのアイテムをその名前で取得し、配列から削除する必要があります。

4

4 に答える 4

1
myArray.splice(myArray.indexOf("duck"), 1);
于 2013-03-25T12:05:23.743 に答える
1

これは簡単な方法です。

非安定バージョン(コピーが少なくなります)。

for (var i:int, j:int = array.length - 1, temp:Object; i <= j;) {
    temp = array[i];
    if (temp == "duck") {
        array[i] = array[j];
        array[j] = temp;
        j--;
    } else {
        i++;
    }
}
array.length = i;

そして、安定したバージョン(より多くのコピーがありますが、元の配列の順序は変更されていません):

for (var i:int, j:int, temp:Object; i < array.length; i++) {
    temp = array[i];
    if (temp != "duck") {
        array[j] = temp;
        j++;
    }
}
array.length = j;

ただし、値が一意であることを保証できれば、見つけたアイテムの後にアイテムを検証する必要がないため、アルゴリズムは異なります。

二分探索を使用して削除する要素を見つけることができるため、配列がソートされている場合、アルゴリズムは大幅に異なります。たとえば、十分に根拠のあるセット(配列)がある場合など、非常に特殊な状況では、検索するアイテムの位置を一定時間で決定できるため、削除はさらに簡単になります。後者は、インデックスを使用することで軽減できます(簡単に言えば、配列の要素をキーとして使用し、配列へのオフセットを値として使用するハッシュテーブルを作成できます)。

繰り返しになりますが、これらすべてのケースと、プログラムに関して実際的なことを考慮する必要があります。

上で述べたように、別のデータ構造を使用する場合、挿入時に並べ替える場合、または挿入時にインデックスを作成する場合にメリットがあります。

最後に、不要なアイテムを削除してコピーを作成することは、同じ配列からアイテムを破壊的に削除することとは異なります。

于 2013-03-25T12:25:14.337 に答える
0

アレイが非常に長い場合は、何らかの方法で最適化する価値があります。

いくつかのオプション:

1)辞書を使用します。文字列をキーにすることができます。これには、要素を追加/削除するときにリストのインデックスを再作成しないという追加の利点があります。

//specify weak keys when you create the dictionary
var myDictionary:Dictionary = new Dictionary(true);
//when you want to delete an item:
myDictionary["duck"] = null;

2)配列を並べ替え、バイナリ検索を使用します。オンラインでの二分探索についてはたくさんの情報があります。これがこのトピックに関する1つのSO質問です。

于 2013-03-25T12:30:39.817 に答える
0

1つの方法は、whileループを配列のindexOfメソッドと組み合わせて使用​​することです。

var index:int;
while ((index = myArray.indexOf("duck")) >= 0)
{
    myArray.splice(index,1);
}

これを関数でラップし、ArrayパラメーターとStringパラメーターを受け入れて、次のように結果の配列を返すことができます。

function removeSearchString(sourceArray:Array, searchString:String):Array
{
     var index:int;
     while ((index = sourceArray.indexOf(search)) >= 0)
     {
          sourceArray.splice(index,1);
     }
     return sourceArray;
}

次に、次のような関数を使用します。

myArray = removeSearchString(myArray, "duck");
于 2013-03-26T00:51:05.890 に答える