1

我有一个浏览器部署的 Flash 应用程序(不是一个可以访问 SQLConnection 的 AIR 应用程序),它通过 HTTPService 从远程服务器获取 JSON 结果。

我需要有效地从返回的结果集中提取子集,一个对象数组。通过云到后端的多次调用是不行的。这一切都必须发生在客户端。

Flex ActionScript中是否有任何集合类可以通过对象都具有的共同属性之一对对象数组进行排序,例如Array sortOn方法,然后还提供二进制搜索方法可以从排序的对象中提取对象子集数组的版本,而不访问数组中的每个项目并进行比较

例如,如果我有一个对象数组并且每个对象都有一个zip属性和一个name属性,我希望能够从原始数组的副本中提取所有zip = 10015 的对象,其中副本已排序拉链

谢谢

4

2 回答 2

0

我不知道有任何进行二进制搜索的内置集合。但是您可以使用该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 的整个子集。


顺便说一句,如果数据太大而无法在客户端使用常规方法进行搜索,那么它是否也足以成为带宽瓶颈?

于 2010-01-25T16:26:35.250 回答
0

您可以使用array.sortOn()然后在已排序的数组上迭代一次(从 0 开始):当您到达第一个匹配项时,在向前迭代时开始返回元素,直到您停止匹配。这将返回匹配元素的整个子集,平均而言,您将只访问原始数组的一半(排序后)。

(If this is too slow, it might be quicker,depending on your data, to use a binary search to get a match, then iterate down until you stop matching ie find the first match in the ordered set, then start returning elements as you iterate upwards until you run out of matches... BUT the time saving might be marginal compared to the time needed to do the original sortOn())

于 2010-01-25T23:01:34.233 回答