Действие Flash-браузерного приложения Script:как эффективно извлечь подмножество объектов из отсортированного массива *?

StackOverflow https://stackoverflow.com/questions/2133252

Вопрос

У меня есть Flash-приложение, развернутое в браузере (не AIR-приложение с доступом к SqlConnection), и оно извлекает результаты JSON с удаленного сервера через HTTPService.

Мне нужно извлечь подмножества из возвращаемого результирующего набора, массива объектов, эффективно.Множественные вызовы через облако на серверную часть не подойдут.Все это должно происходить на стороне клиента.

Существует ли какой-либо класс collection в Flex ActionScript, который может сортировать массив объектов по одному из свойств, общих для всех объектов, например Array сортОн метод, а затем также предоставляет бинарный поиск метод может извлекать подмножество объектов из отсортированной версии массива без посещения каждого элемента в массиве и сравнения?

Например.если у меня есть массив объектов, и каждый объект имел застежка - молния собственность и Имя свойство, я хотел бы иметь возможность извлекать все объекты с застежка - молния = 10015 из копии исходного массива , в котором копия была отсортирована по застежка - молния.

Спасибо

Это было полезно?

Решение

Я не знаю ни о какой встроенной коллекции, которая выполняет двоичный поиск.Но вы можете отсортировать массив, используя Array::sortOn метод и напишите свой собственный код для двоичного поиска.Вы можете начать с чего-то вроде:

private static search(array:Array, prop:String, value:Object, 
        frm:Number, to:Number):Number
{
  if(to - frm <= 1)
  {
    if(array[frm][prop] == value)
      return frm;
    if(array[to][prop] == value)
      return to;
    return -1;
  }
  var mid:int = (to + frm) / 2;
  //use a compare function that returns -1, 0, +1 based on their relative values
  if(array[mid][prop] == value)
    return mid;
  if(array[mid][prop] > value)
    return search(array, prop, value, frm, mid - 1);
  return search(array, prop, value, mid + 1, to);
}
array.sortOn("zip", Array.NUMERIC);
var index:Number = ClassName.search(array, "zip", "10015", 0, array.length - 1);

Теперь вы можете выполнять поиск вверх и вниз по возвращенному значению индекса (если оно равно != -1) и извлекать все подмножество со значением zip = 10015.


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

Другие советы

Вы могли бы использовать array.sortOn() а затем выполните итерацию один раз по отсортированному массиву (начиная с 0):когда вы достигнете первого совпадения, начинайте возвращать элементы по мере продвижения вперед, пока не прекратите сопоставление.Это возвращает все подмножество совпадающих элементов, и в среднем вы будете просматривать только половину исходного массива (после сортировки).

(Если это слишком медленно, может быть быстрее, в зависимости от ваших данных, использовать двоичный поиск для получения совпадения, затем выполнять итерацию вниз до тех пор, пока вы не прекратите сопоставление, т. Е. найдите первое совпадение в упорядоченном наборе, затем начните возвращать элементы по мере выполнения итерации вверх, пока совпадения не кончатся...НО экономия времени может быть незначительной по сравнению со временем, необходимым для выполнения исходной сортировки())

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top