Flex 3: пустые ключи в коллекции массивов ... возможно? - PullRequest
1 голос
/ 12 июля 2011

Разрешает ли flex пустые или отсутствующие ключи в коллекции массивов?Например, будет ли в порядке следующий код:

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

Вот почему я спрашиваю.Мое приложение получает список XML, полный имен учеников.Каждый студент имеет уникальный идентификационный номер.Эти идентификационные номера не всегда будут последовательными.У меня есть функция, в которой вы передаете идентификационный номер студента, и вы возвращаете их имя.С сотнями студентов в списке, простой для каждого цикла, который проверяет, совпадает ли переданный идентификатор с тем, который просматривается в данный момент при циклическом просмотре коллекции массивов, расточительно.Я хотел бы заполнить коллекцию массивов и сделать так, чтобы идентификатор студента был ключевым.Таким образом, я могу сделать следующее, чтобы вернуть имя:

return myAC.getItemAt(sID);

Возможно ли это?Я подумал, что будет разумнее сначала спросить, а потом попробовать ...

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Разрешает ли flex пустые или отсутствующие ключи в коллекции массивов?

В Flex Array или ArrayCollection не используют ключи.Массивы по своей природе основаны на индексах.Можете ли вы иметь элемент в массиве, который имеет значение null или какое-то другое «неактивное» значение?Да, я не понимаю, почему нет.

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

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, вы увидите, что значения словаря установлены и отслежены.

2 голосов
/ 12 июля 2011

Есть ли причина, по которой вам нужно, чтобы он был в массиве, если вы не выполняете циклы или последовательный поиск?Было бы намного проще использовать словарь:

var dict:Dictionary = new Dictionary();
dict[studentId] = studentObject;
...