as3: самый быстрый способ поиска следующего более высокого / более низкого значения в несортированном массиве? - PullRequest
0 голосов
/ 16 марта 2011

как обращаться с несортированными массивами, чтобы получить следующее более высокое или следующее меньшее значение?

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 ]

2 голосов
/ 16 марта 2011

Вы все еще можете использовать сортировку, даже если ваш массив по какой-то причине должен оставаться в том же несортированном состоянии.Бьюсь об заклад, использование родных методов сортировки 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 голос
/ 16 марта 2011

Я бы сказал, что если вы не можете отсортировать массив, то вы мало что можете сделать, чтобы улучшить производительность алгоритмов.Любое доступное решение должно всегда проходить через каждый элемент в массиве, что означает отсутствие прироста производительности.Даже если вы используете вспомогательный преобразователь (или дублированный отсортированный массив), вам придется пересчитывать его каждый раз, когда в основной массив вносятся изменения ... не хорошо!

Я думаю, что у вас есть что-то вроде этого:

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