as3:在未排序数组中搜索下一个更高/更低值的最快方法?

时间:2011-03-15 21:33:47

标签: flash actionscript-3 adobe

如何处理未排序的数组以获得下一个更高或下一个更小的值?

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)?

2 个答案:

答案 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);