繁体   English   中英

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

[英]as3: fastest method to search next higher/lower value in unsorted array?

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

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

即使您的数组由于某种原因必须保持相同的未排序状态,您仍然可以使用排序。 而且我敢打赌,使用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);
} 

我要说的是,如果无法对数组进行排序,那么您就无能为力了,无法提高算法性能。 任何可用的解决方案都必须始终遍历数组中的每个项目,这意味着没有性能提升。 即使您使用了辅助映射器(或重复的排序数组),也必须在每次对主数组进行更改时重新计算它……不好!

我认为您有这样的事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM