Aplicativo de navegador Flash ActionScript:como extrair um subconjunto de objetos de uma matriz classificada *eficientemente*?

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

Pergunta

Eu tenho um aplicativo Flash implantado no navegador (não um aplicativo AIR com acesso ao SQLConnection) e ele busca resultados JSON de um servidor remoto via HTTPService.

Preciso extrair subconjuntos do conjunto de resultados retornado, uma matriz de objetos, eficientemente.Várias chamadas através da nuvem para o back-end não funcionarão.Tudo tem que acontecer do lado do cliente.

Existe alguma classe de coleção no Flex ActionScript que possa classificar um array de objetos por uma das propriedades que todos os objetos têm em comum, como o Array classificar em método e, em seguida, também fornece um pesquisa binária método pode extrair um subconjunto de objetos da versão classificada do array sem visitar todos os itens da matriz e comparar?

Por exemplo.se eu tiver uma matriz de objetos e cada objeto tiver um fecho eclair propriedade e um nome propriedade, gostaria de poder extrair todos os objetos com fecho eclair = 10015 da cópia do array original onde a cópia foi classificada fecho eclair.

Obrigado

Foi útil?

Solução

Não tenho conhecimento de nenhuma coleção embutida que faça uma pesquisa binária.Mas você pode classificar o array usando o Array::sortOn método e escreva seu próprio código para pesquisa binária.Você pode começar com algo como:

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

Agora você pode pesquisar para cima e para baixo a partir do valor do índice retornado (se for! = -1) e recuperar todo o subconjunto com valor zip = 10015.


A propósito, se os dados forem muito grandes para serem pesquisados ​​no lado do cliente usando métodos normais, não seriam grandes o suficiente para ser um gargalo de largura de banda também?

Outras dicas

Você poderia usar array.sortOn() E depois itera uma vez sobre a matriz classificada (a partir de 0): Quando você chegar à primeira partida, comece a devolver os elementos à medida que itra para a frente, até parar de corresponder. Isso retorna todo o subconjunto de elementos correspondentes e, em média, você estará visitando apenas metade da matriz original (após a classificação).

(Se isso for muito lento, pode ser mais rápido, dependendo dos seus dados, usar uma pesquisa binária para obter uma correspondência e depois itera até parar de corresponder ao isto é, encontre a primeira partida no conjunto ordenado e comece a retornar os elementos à medida que você itera para cima até ficar sem fósforos ... mas a economia de tempo pode ser marginal em comparação com o tempo necessário para fazer o original ())

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top