如何处理未排序的数组以获得下一个更高或下一个更小的值?
var _myArray:Array = (1,pizza,2,6,8,test,11,16,17,cola)
_myArray.splice(4,1) // > remove number 8 !
trace(_myArray) // > array contains now: (1,pizza,2,6,test,11,16,17,cola)
如何获得下一个更高的值(= 11)?
答案 0 :(得分:2)
即使您的数组由于某种原因必须保持相同的未排序状态,您仍然可以使用排序。我敢打赌,使用Flash的原生排序方法将比创建自己的排序方法更快。但是,您必须遍历整个阵列一次:
var sortedArray : Array = [];
for ( var i:int = 0; i < _myArray.length; i++) {
var o:Object = _myArray[i];
// use only int values for sorting:
if (o is int) sortedArray.push ({index:i, value:o});
}
sortedArray.sortOn ("value", Array.NUMERIC);
结果将是所有整数值及其索引的排序数组。 然后你可以迭代这些:
for each ( var n:Object in sortedArray) {
doSomethingWith (n.value);
}
sortedArray.sortOn ("index", Array.NUMERIC);
for ( var i:int = sortedArray.length-1; i >= 0; i-- ) {
_myArray.splice (sortedArray[i].index,1);
}
答案 1 :(得分:1)
我想说如果你不能对数组进行排序,那么你就无法提高算法的性能。任何可用的解决方案都必须始终遍历数组中的每个项目,这意味着没有性能提升。即使您使用了辅助映射器(或重复排序的数组),每次在主阵列上进行更改时都必须重新计算它...不好!
我认为你有这样的事情:
private function getNext(array:Array, value:Number):Number {
var higher:Number = Number.MAX_VALUE;
var position:Number = NaN;
for (var i:int = 0; i < array.length; i++) {
if (!(array[i] is Number)) {
continue;
}
var currentNumber:Number = array[i];
if (currentNumber >= value && currentNumber < higher) {
higher = currentNumber;
position = i;
}
}
return position;
}
用法:
getNext(myArray, 8);