In AS3 waar trek je de grens tussen Woordenboek en ArrayCollection tekenen?

stemmen
0

In principe Ik ben al met behulp van een woordenboek object in mijn programma dat in principe nam ints als zijn sleutels en opgeslagen RTMFP peer-id's in de juiste locaties. Elke int was uniek en vertegenwoordigde één gebruiker.

Nu ben ik nodig om uit te breiden op deze waar de gebruikers worden geïdentificeerd door een combinatie van de int en een Booleaanse waarde, net zoiets als dit:

private var m_iUID:int;
private var m_blnIsCurrent:Boolean;

Alleen de combinatie van die twee echt unieke identificatie van de gebruiker. Dat gezegd zijnde was ik op het punt om een ​​nieuwe klasse gemaakt van deze voor het Woordenboek toetsen; maar toen viel het me op dat in plaats van het doen van het op deze manier, kon ik voeg gewoon de peer-ID aan de definitie van de klasse en zet de Dictionary object in een ArrayCollection:

private var m_iUID:int;
private var m_blnIsCurrent:Boolean;
public var m_strNearID:String;

Dus nu ben ik benieuwd wat echt beter in dit scenario. En die vraag heeft geleid tot een grotere vraag: waar heb je echt de lijn tussen deze twee soorten collectie in het algemeen tekenen? Ze plotseling beginnen te lijken al die verschillende immers, behalve wanneer je probeert te voorkomen dat knoeien met klasse definities. Ik denk dat ik echt vragen om advies over zowel de specifieke scenario en de algemene vraag. Bedankt!

De vraag is gesteld op 03/12/2012 om 19:10
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

Dictionaryen ArrayCollectionhebben een aantal belangrijke verschillen:

  • Dictionarykaarten objecten aan andere objecten, terwijl het ArrayCollectionis gewoon een lijst van objecten.
  • ArrayCollection is Flex alleen, dus onbruikbaar in een generieke AS3 project.

Welke je moet gebruiken hangt af van wat je nodig hebt in uw app:

  • Zult u met behulp van de "identiteit" object (met een gebruikersnaam en "actueel") ergens anders, zonder een bijbehorende peer-id? In dat geval maakt het een aparte Identityklasse of zo en het gebruik van een Dictionaryin kaart Identitygevallen om ids-peer.
  • Moet u lookups op basis van identiteiten te voeren? Met andere woorden, heb je nodig om te vragen "die peer-id is gekoppeld aan deze identiteit?". Als dat zo is, ga dan voor Dictionary+ Identitynog eens, om te voorkomen dat een lus door een lijst in plaats daarvan.

Ik weet zeker dat er meer overwegingen, maar deze moet u op weg helpen.

antwoordde op 03/12/2012 om 19:33
bron van user

stemmen
4

ArrayCollection is gewoon een wrapper voor een Array, en is alleen verkrijgbaar in Flex.

In AS3 je echt 3 fundamentele types hash tabel: Array, Object en Dictionary. U kiezen welke u wilt gebruiken op basis van de aard van de toets die u wilt gebruiken: een integer, een string of een object referentie. Arrays zal omzetten op een toets om een int, zal object op een willekeurige toets om te zetten in een string. Woordenboek werkt als object voor strijkorkest toetsen (en zal omzetten primitieven naar een string), maar wat het is echt goed in is het gebruik van object referenties als sleutels.

Het je om een ​​enkele int gebruiken als unieke sleutel, gebruik maken van een array. Wilt u één tekenreeks gebruiken als unieke sleutel, gebruik maken van een object. Als u wilt object referenties gebruiken als unieke sleutel, gebruik dan een woordenboek.

In uw geval moet u waarschijnlijk een object, en een op maat te gebruiken toString()methode op de "sleutel" klasse. Dit komt omdat je wilt een composiet van primitieve waarden (NIET een referentie object) gebruiken als unieke sleutel. Er is geen manier om dit natively doen, dus je moet de waarden samen mash als een enkele string. Objecten zijn de beste (snelste) hash tabel voor strijkkwartet sleutels, dus dat is de verzameling die u moet gebruiken.

Voorbeeld:

class User {
    private var m_iUID:int;
    private var m_blnIsCurrent:Boolean;
    public var m_strNearID:String;
    public function User(UID:int, IsCurrent:Boolean) {
        m_iUID = UID;
        m_blnIsCurrent = IsCurrent;
    }

    // Custom toString to mash together primitives
    public function toString() {
        return m_iUID.toString() + "-" + (m_blnIsCurrent ? "1" : "0");
    }
}

// Later:
var allUsers:Object = {}
var user1:User = new User(231049, true);
var user2:User = new User(0x2309, false);

// Implicitly calls toString():
allUsers[user1] = "User 1";
allUsers[user2] = "User 2";

// All of the following will successfully retrieve the value for user1 ("User 1"):
// ONLY the first would work if allUsers was a Dictionary
trace(allUsers[user1]);
trace(allUsers[user1.toString()]); 
trace(allUsers["231049-1"]); 
trace(allUsers[new User(231049, true)]); 
antwoordde op 03/12/2012 om 19:51
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more