AS3从阵列中删除元素,无需更改位置

时间:2011-11-15 05:29:25

标签: arrays actionscript-3 function flash-cs5

我想编写一个函数,它从最低值开始从整数数组中删除元素,而不改变元素的位置。编程语言是ActionScript3。

e.g。 (这些是单独的跟踪声明)

    var aNumArr:Array = [0,7,2,5,9,0]
    trace(RemoveMinValues(aNumArr, 1, false)) //output: 7,2,5,9,0
    //trace(RemoveMinValues(aNumArr, -1, true)) //output: 0,7,2,5,9
    //trace(RemoveMinValues(aNumArr, 2)) //output: 7,2,5,9

我已设法使用sort(Array.NUMERIC)sort(Array.DESCENDING)删除数组中的最低值。

但我似乎无法弄清楚如何将元素移回原来的位置。

由于这是作业,我无法复制整个功能代码。我希望你不要告诉我确切的答案,而是让我深入了解如何去做。

希望我足够清楚。如果您需要其他信息,请与我们联系。

提前致谢。


编辑:我意识到我错过了关于这个功能的一些东西。我还更改了aNumArr和所需的输出值,以使其更清晰。

这就是我之前做过的事情:

    function RemoveMinValues(aNumArr:Array, iMinsToRemove:int):void
    {
         if(iMinsToRemove >= 0)
         {
              aNumArr.sort(Array.NUMERIC);
              for(var i:int = 0; i < iMinsToRemove; ++i)
              {
                   aNumArr.shift();
              }
         }
         else
         {
              aNumArr.sort(Array.DESCENDING);
              for(var i:int = 0; i > iMinsToRemove; --i)
              {
                   aNumArr.pop();
              }
         }
    }

基本上aNumArr:Array是指定的整数数组。 iNumbersOfMinsToRemove:int是要删除的最小值的数量。 作业要求我返回没有

我知道Array.NUMERIC和Array.DESCENDING会改变元素的位置,但我似乎无法弄清楚如何保持其位置的逻辑。请尽量保持简单。我还是个傻瓜。

3 个答案:

答案 0 :(得分:1)

不是删除值,而是将其设置为null。更好的是,将其设置为Math.NEGATIVE_INFINITY,以便排序顺序保持不变。

这样,数组索引将保持不变,因为您修改值,而不是删除

答案 1 :(得分:0)

首先,请注意Math.min()和Math.max()可以使用任意数量的参数。另外,理解Function对象可用的apply()方法很重要。它允许您使用Array将参数传递给函数。让我们利用两者:

var aNumArr:Array = [0,7,2,5,9];
var maxValue:Number = Math.max.apply(null, aNumArr);
var minValue:Number = Math.min.apply(null, aNumArr);

这是最好的部分:“循环”实际上是使用本机代码(在Flash Player内部)运行的,因此它比使用纯ActionScript循环搜索最小值或最大值更快。

答案 2 :(得分:0)

[[编辑]]

将代码添加到其他人的剧透块中。


如果我理解您的问题,您希望调查Array.filter。如果你问的问题需要每个RemoveMinValues传递的最终结果返回一个维持相对位置而不是绝对位置的数组,那么filter方法最好。

给出以下数组的区别在于,假设RemoveMinValues的第二个参数是最小值,默认为0。

var arr:Array = [-1,3,2,1,0];

绝对位置:

RemoveMinValues(arr)    // [null,3,2,1,null]
RemoveMinValues(arr, 1) // [null,3,2,null,null]

相对位置:

RemoveMinValues(arr)    // [3,2,1]
RemoveMinValues(arr, 1) // [3,2]

RemoveMinValues的以下方法实现将提供“相对”结果。请花些时间阅读Array.filter文档。每次调用RemoveMinValues,使用此特定实现,都会返回一个新数组而不修改原始数据,如文档中所定义。

代码:

  

target.filter(function(item:*,... args):Boolean {return item&gt; minValue});

此方法在较大的数据集上会较慢。切换到Vector对象可以解决性能问题。

祝你好运!