如何从包含数百个项目的数组中删除特定项目?
-例如:
var myArray:Array = ["dog", "cat", "bear", "duck", "frog", etc..., etc...];
当我想从这个数组中删除“鸭子”时,我该怎么办?请记住,数组很长,我们不知道“鸭子”在哪里,所以我们不知道它是数组中的索引。我需要以某种方式通过它的名称获取该项目并将其从数组中删除。
如何从包含数百个项目的数组中删除特定项目?
-例如:
var myArray:Array = ["dog", "cat", "bear", "duck", "frog", etc..., etc...];
当我想从这个数组中删除“鸭子”时,我该怎么办?请记住,数组很长,我们不知道“鸭子”在哪里,所以我们不知道它是数组中的索引。我需要以某种方式通过它的名称获取该项目并将其从数组中删除。
myArray.splice(myArray.indexOf("duck"), 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;
但是,如果您可以确保值是唯一的,那么算法会有所不同,因为您不必在找到的项目之后验证项目。
如果对数组进行了排序,则算法将大不相同,因为您可以使用二进制搜索来查找要删除的元素。在一些非常特殊的情况下,例如,如果您有一个有根据的集合(即您的数组),则删除会更加简单,因为您正在搜索的项目的位置可以在恒定时间内确定。后者可以通过使用索引来缓解(简单地说,你可以有一个哈希表,它使用数组的元素作为它的键和它们在数组中的偏移量作为值)。
同样,您需要考虑所有这些情况以及您的程序的实际情况。
正如我上面提到的,如果您使用不同的数据结构,或者如果您在插入时排序,或者如果您在插入时建立索引,则可能会有好处。
最后,生成删除了不需要的项目的副本不同于从同一数组中破坏性地删除项目。
如果您的数组很长,那么值得以某种方式对其进行优化。
一些选项:
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)对数组进行排序并使用二进制搜索。网上有很多关于二分搜索的信息。这是关于该主题的一个 SO 问题。
一种方法是将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");