我想编写一个函数,它从最低值开始从整数数组中删除元素,而不改变元素的位置。编程语言是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会改变元素的位置,但我似乎无法弄清楚如何保持其位置的逻辑。请尽量保持简单。我还是个傻瓜。
答案 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对象可以解决性能问题。
祝你好运!