Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash as3:在未排序数组中搜索下一个较高/较低值的最快方法?_Flash_Actionscript 3_Adobe - Fatal编程技术网

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

Flash as3:在未排序数组中搜索下一个较高/较低值的最快方法?,flash,actionscript-3,adobe,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)?我想说,如果您无法对数组进行排序,那么您就无法改善

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

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

我想说,如果您无法对数组进行排序,那么您就无法改善算法性能。任何可用的解决方案都必须始终循环遍历阵列中的每个项,这意味着没有性能增益。即使您使用了辅助映射器(或重复的排序数组),每次对主数组进行更改时都必须重新计算它…不好

我认为你有这样的想法:

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

我想说的是,如果你不能对数组进行排序,那么你就不能做很多事情来提高算法的性能。任何可用的解决方案都必须始终循环遍历阵列中的每个项,这意味着没有性能增益。即使您使用了辅助映射器(或重复的排序数组),每次对主数组进行更改时都必须重新计算它…不好

我认为你有这样的想法:

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

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

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


在找到值之前,是否必须让它保持未排序状态?如果没有,请对其排序,然后只执行比您首先选择的高1个索引。为什么要将数字和字符串存储在同一个数组中?不幸的是,我只能将此类数据(数k)存储几秒钟,我当前的函数需要3029ms。您的数组有多大?或者它将得到的最大值?如果您可以将当前的算法粘贴到这里,可能会有所帮助。这将使思考变得更容易,我们也不必对您的数据进行任何假设。在找到价值之前,您是否必须对其进行分类?如果没有,请对其排序,然后只执行比您首先选择的高1个索引。为什么要将数字和字符串存储在同一个数组中?不幸的是,我只能将此类数据(数k)存储几秒钟,我当前的函数需要3029ms。您的数组有多大?或者它将得到的最大值?如果您可以将当前的算法粘贴到这里,可能会有所帮助。这将使思考变得更容易,我们不必对您的数据做任何假设。排序总是比这更快,除非您只想做一次。即使你要实现自己的排序算法,它也会对整个数组进行一次排序,然后你只需在下一个最高索引处获取条目。实际上,我试着用你的解决方案和我的解决方案解析整个数组。我花了更长的时间_myArray=
[1,“披萨”,2,6,8,“测试”,11,16,17,“可乐”,3,“汉堡”,3,5,4,9,12,10,15,13,14,19,18,“薯条”]。正如您所看到的,这里较低的数字可能比较高的数字(没有顺序)在更晚的索引中。我的解决方案不仅只需要完成时间的一半(2毫秒比4毫秒),而且您的解决方案还为数组中的每个字符串值返回0。另一个优点是在排序时使用Array.UNIQUE,以防止出现双重结果。这是一个通用解决方案,为了获得优化的解决方案,您必须做出一些假设。这个问题没有具体说明要求,也没有说明与myArray操作相关的操作/算法。例如,如果算法(您的
doSomething()
)依赖于当前myArray的状态,那么您的解决方案将无法工作(除非您对其进行调整)。没有这类信息,很难找到理想的解决方案;)我同意;)尽管在我最后一次对另一个答案的评论中有一个更一般的方法,排序总是比这个更快,除非你只想做一次。即使你要实现自己的排序算法,它也会对整个数组进行一次排序,然后你只需在下一个最高索引处获取条目。实际上,我试着用你的解决方案和我的解决方案解析整个数组。我花了更长的时间_myArray=
[1,“披萨”,2,6,8,“测试”,11,16,17,“可乐”,3,“汉堡”,3,5,4,9,12,10,15,13,14,19,18,“薯条”]。正如您所看到的,这里较低的数字可能比较高的数字(没有顺序)在更晚的索引中。我的解决方案不仅只需要完成时间的一半(2毫秒比4毫秒),而且您的解决方案还为数组中的每个字符串值返回0。另一个优点是在排序时使用Array.UNIQUE,以防止出现双重结果。这是一个通用解决方案,为了获得优化的解决方案,您必须做出一些假设。这个问题没有具体说明要求,也没有说明与myArray操作相关的操作/算法。例如,如果算法(您的
doSomething()
)依赖于当前myArray的状态,那么您的解决方案将无法工作(除非您对其进行调整)。没有这类信息,很难找到理想的解决方案;)我同意;)虽然在我最后一次对另一个答案的评论中有一个更一般的方法,我可能遗漏了一些东西,但我认为这不会奏效。执行
\u myArray.splice(n.index,1)后你的数据必须重新计算,否则索引将(很可能)过时/错误。当然,你是对的。为我辩护:我写这篇文章时非常累;)我已经更改了上面的代码,更好=)这里重要的一点是,在doSomething()调用期间不能更新myArray(添加/编辑/删除),否则索引将再次混乱。这一切都取决于现在的需求……您可能可以使用
while(_myArray.leng