1

ブラウザーでデプロイされた Flash アプリ (SQLConnection にアクセスできる AIR アプリではない) があり、HTTPService を介してリモート サーバーから JSON 結果をフェッチします。

返された結果セット (オブジェクトの配列) からサブセットを効率的に抽出する必要があります。クラウドを介したバックエンドへの複数の呼び出しは機能しません。それはすべてクライアント側で発生する必要があります。

Array sortOnメソッドのように、すべてのオブジェクトが共通に持っているプロパティの 1 つによってオブジェクトの配列を並べ替えることができる Flex ActionScript のコレクション クラスはありますか?配列内のすべての項目にアクセスして比較することなく、配列のバージョンを取得しますか?

たとえば、オブジェクトの配列があり、各オブジェクトに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

使用してから、並べ替えられた配列を 1 回反復することができますarray.sortOn()(0 から開始): 最初の一致に達したら、一致を停止するまで前方に反復しながら要素を返し始めます。これにより、一致する要素のサブセット全体が返され、平均して、(並べ替え後に) 元の配列の半分だけにアクセスすることになります。

(これが遅すぎる場合は、データによっては、バイナリ検索を使用して一致を取得し、一致を停止するまで繰り返します。つまり、順序付けられたセットで最初の一致を見つけてから、要素を返し始めます。一致がなくなるまで上向きに繰り返します...しかし、元のsortOn()を実行するのに必要な時間と比較して、時間の節約はわずかかもしれません)

于 2010-01-25T23:01:34.233 に答える