1

flex は、配列コレクション内の空のキーまたは欠落したキーを許可しますか? たとえば、次のコードは問題ありません。

var myAC:ArrayCollection = new ArrayCollection;
myAC.addItemAt("hi", 0);
myAC.addItemAt("hola", 4);
myAC.addItemAt("bye", 17);
myAC.addItemAt("adios", 32);

これが私が尋ねる理由です。私のアプリケーションには、学生の名前でいっぱいの XML リストが与えられています。各学生には固有の ID 番号があります。これらの ID 番号は常に連続しているとは限りません。学生ID番号を渡す関数があり、名前を返します。リストに何百人もの学生がいる場合、配列コレクションをループしながら、渡された ID が現在見ている ID と一致するかどうかを確認する単純な for each ループは無駄です。配列コレクションにデータを入力し、学生 ID をキーにしたいと考えています。このようにして、次のようにして名前を返すことができます。

return myAC.getItemAt(sID);

これは可能ですか?最初に聞いてから試した方が賢明だと思いました...

4

2 に答える 2

3

flex は、配列コレクション内の空のキーまたは欠落したキーを許可しますか?

Flex では、Array または ArrayCollection はキーを使用しません。配列は、その性質上、インデックス ベースです。null またはその他の「非アクティブな」値である項目を配列に含めることはできますか? はい、私には理由がわかりません。

キーを介して要素にアクセスする場合は、汎用のObjectまたはDictionaryを使用する必要があります。ただし、これを行うと、配列によって提供される順序付けがすべて失われます。Dictionary を使用するために、コードを次のように書き直すことができます。

var myAC:Dictionary= new Dictionary();
myAC["0"] = "hi";
myAC["4"] = "hola";
myAC["17"] = "bye";
myAC["32"] = "adios";

return myAC[sID];

コメントでは、上記のコードは、辞書のキーを b/c して数字を使用できないことが言及されていました。ただし、そうではないことを示す完全なサンプルを次に示します。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            public var dict : Dictionary;

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                dict = new Dictionary();
                dict["0"] = "hi";
                dict["4"] = "hola";
                dict["17"] = "bye";
                dict["32"] = "adios";


                trace(dict["0"]);
                trace(dict["4"]);
                trace(dict["17"]);
                trace(dict["32"]);


            var obj : Object = new Object();
            obj["0"] = "hi";
            obj["4"] = "hola";
            obj["17"] = "bye";
            obj["32"] = "adios";

            trace(obj["0"]);
            trace(obj["4"]);
            trace(obj["17"]);
            trace(obj["32"]);


            }

        ]]>
    </fx:Script>
</s:Application>

サンプルの ind デバッグ モードを実行すると、ディクショナリの値が設定され、トレースされていることがわかります。

于 2011-07-12T18:34:20.343 に答える
2

ループやシーケンシャル ルックアップを行っていない場合、配列にする必要がある理由はありますか? 辞書を使用する方がはるかに簡単です。

var dict:Dictionary = new Dictionary();
dict[studentId] = studentObject;
于 2011-07-12T18:33:06.947 に答える