【问题标题】:actionscript subtract specific items from arrayactionscript 从数组中减去特定项目
【发布时间】:2013-03-25 11:59:16
【问题描述】:

如何从包含数百个项目的数组中删除特定项目?

-例如:

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

当我想从这个数组中删除“鸭子”时,我该怎么办?请记住,数组很长,我们不知道“鸭子”在哪里,所以我们不知道它是数组中的索引。 我需要通过它的名称以某种方式获取该项目并将其从数组中删除。

【问题讨论】:

  • @Peter 我希望数组内容是字符串,如果是的话,请引用它们。目前最好的方法似乎是第一个: var i: int = myArray.indexOf(duck); (如果字符串使鸭子成为“鸭子”)并像这样添加伊利亚的答案: if(i>=0)myArray.splice(i,1);

标签: arrays actionscript-3 subtraction


【解决方案1】:
myArray.splice(myArray.indexOf("duck"), 1);

【讨论】:

  • 这是一个关于数组和动作脚本的问题,而不是关于最佳算法的问题
  • 我不做作者没有问的工作,如果你有意见你可以写自己的答案
  • 是的,这些项目是字符串,我忘了加上引号,谢谢提醒 - 刚刚修复它。谢谢大家的答案。我会试试 indexOf 的东西。
  • 如果找不到参数,@PeterBeelich indexOf() 将返回值 -1。如果需要,您可以使用复杂的结构(如 while ((i=myArray.indexOf("duck"))>=0) myArray.splice(i,1);)来删除所有出现的“鸭子”。
【解决方案2】:

这是一种直接的方式:

非稳定版本(复制较少)。

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;

但是,如果您可以确保值是唯一的,那么算法会有所不同,因为您不必在找到后验证项目。

如果对数组进行了排序,算法将大不相同,因为您可以使用二进制搜索来查找要删除的元素。在一些非常特殊的情况下,例如,如果您有一个有根据的集合(即您的数组),则删除会更加简单,因为您正在搜索的项目的位置可以在恒定时间内确定。后者可以通过使用索引来缓解(简单地说,你可以有一个哈希表,它使用数组的元素作为它的键和它们在数组中的偏移量作为值)。

同样,您需要考虑所有这些情况以及您的程序的实际情况。

正如我上面提到的,如果您使用不同的数据结构,或者如果您在插入时排序,或者如果您在插入时建立索引,则可能会有好处。

最后,生成删除了不需要的项目的副本不同于从同一数组中破坏性地删除项目。

【讨论】:

    【解决方案3】:

    如果您的数组很长,那么值得以某种方式对其进行优化。

    一些选项:

    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) 对数组进行排序并使用二进制搜索。网上有很多关于二分搜索的信息。 Here's one SO question on the topic.

    【讨论】:

    • 来自答案:“这只会简化代码,并且可能是非最佳性能。”
    • @mfa 向后运行数组(从length-1 到零)更优化,并且不关心长度变化。
    • 删除了选项#3;人们没有读到它不是最佳的
    【解决方案4】:

    一种方法是使用 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");
    

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多