Brds
Brds

Reputation: 1075

Flex 3: Can anybody see why this dictionary isn't working?

So, in my main mxml, i have a variable defined as such:

[Bindable] public var studentsListDict:Dictionary = new Dictionary;

I also have the following imported:

import flash.utils.Dictionary;

I then have an HTTPService that imports an XML file:

<mx:HTTPService id="studentsHttp" url="students.xml" resultFormat="e4x" makeObjectsBindable="true" result="createStudentsCollection(event)" />

The createStudentsCollection function is as follows:

private function createStudentsCollection(e:ResultEvent):void
{
    var xmlList:XMLList = XML(e.result).student;
    var dupString:String = "|";
    var tempArray:Array = new Array;
    studentsListDict = new Dictionary;

    for (var i:int = 0; i < xmlList.length(); i++)
    {
        if (dupString.indexOf(String("|" + xmlList[i].name) + "|") == -1)
        {
            tempArray = new Array;
            tempArray[0] = xmlList[i].name.@id;
            tempArray[1] = xmlList[i].name;
            tempArray[2] = xmlList[i].year;
            tempArray[3] = xmlList[i].track;

            studentsListAC.addItem(tempArray);
            studentsListDict[tempArray[0]] = tempArray;
            dupString += "|" + xmlList[i].name + "|";

            getLen(studentsListDict);
        }
    }
}

Then, to ensure the items were correctly put into the dictionary, i have the following function:

public static function getLen(d:Dictionary):int 
{ 
    var i:int = 0; 
    for (var key:Object in d)
    {
        Alert.show(String(key + "\n" + d[key]));
        i++;
    }
    return i; 
} 

This creates pop up alerts that show that everything was loaded correctly into the dictionary.

Later on, in a child, I call a function that tries to use the dictionary, and i get a return of "undefined".

Here's the function that searches based on key, and returns a value from the array within:

public function getStudentName(sID:Number):String
{
    return studentsListDict[sID][1];
}

Unfortunately, the getStudentName function simply returns undefined every time.

If anybody can see something I'm missing, it'd be greatly appreciated.

Thanks, Brds

EDIT

It wasn't working b/c you can't have numbers as keys in a dictionary. Simply casting them to a string during the declaration and look up seems to work just fine.

Upvotes: 2

Views: 787

Answers (2)

JeffryHouser
JeffryHouser

Reputation: 39408

Here is some documentation on dictionary keys..

It looks like you're code is setting it as a string and then accessing it as a number. I suspect that is the root of your problem You can try something like this:

public function getStudentName(sID:Number):String
{
    return studentsListDict[sID.toString()][1];
}

It is actually perfectly acceptable to use numbers as Keys to a Dictionary. The Dictionary apparently turns the number and a string value of that number to the same key. Here is a sample:

<?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: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";
                dict[32] = "adios 2";
                dict[3.2] = "adios 3";
                dict[50] = "Audio ";
                dict["50"] = "Audio 2";

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


            }

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

Upvotes: 2

David Wolever
David Wolever

Reputation: 154594

I think it's because getStudentName is using a Number as a key, while createStudentCollection is using a string. In this case, because the keys are numbers/strings, you can simply use an Object: var studentsListDict:Object = {}; — it will automatically coerce all the keys to strings.

Also, as an asside: new Dictionary(); more standard, and it's better form in ActionScript to use [] (eg, var foo:Array = []) than new Array(). That way you can put stuff in the array at the same time:

var tempArray:Array = [
    xmlList[i].name.@id,
    xmlList[i].name,
    …
];

Upvotes: 1

Related Questions