2009-10-13 16 views
10

Flash implementuje słownik (to jest coś takiego jak HashMap) za pomocą dwóch podejść. Jednym podejściem jest klasa flash.utils.Dictionary, a druga to generyczna Object. Chciałbym sprawdzić, ile par key:value znajduje się w słowniku. W większości przypadków chciałbym po prostu wiedzieć, że istnieją pary dowolne, to znaczy po prostu sprawdź, czy są puste.AS3: Sprawdź, czy słownik jest pusty.

Dokumentacja nie pomogła w tym zakresie. Czy istnieje prosty i jasny sposób na zrobienie tego? Jeśli to się nie powiedzie, czy istnieje brzydki, ale niezbyt kruchy sposób na zrobienie tego?

Odpowiedz

6

Jedynym sposobem, który przychodzi do głowy to iterację wszystkich kluczy i policzyć je - tak jak poniżej:

var count:int = 0; 

for (var key:Object in dict) 
{ 
    count++; 
} 

Całkiem lame - ale myślę, że jest to, co pozostaje. Zwróć uwagę, że słownik jest naprawdę bardzo cienkim opakowaniem dla obiektu waniliowego.

12

To będzie wiarygodnie powiedzieć, czy dany słownik jest pusty:

function isEmptyDictionary(dict:Dictionary):Boolean 
{ 
    for each(var obj:Object in dict) 
    { 
     if(obj != null) 
     { 
      return false 
     } 
    } 
    return true; 
} 

Należy pamiętać, że trzeba zrobić czek obj != null - nawet jeśli ustawisz myDictionary[key] = null będzie nadal iteracyjne jako null obiektu, a więc regularna pętla for...in nie będzie działać w tym przypadku. (Jeśli zawsze używasz delete myDictionary[key] powinieneś być w porządku).

+4

To wydaje się być rozwiązaniem złych praktyk. Usunięcie wpisu ze słownika powinno usunąć zarówno klucz, jak i wartość. Jeśli z jakiegoś powodu chcę usunąć wartość, ale pozostawiam klucz, to dyktat nie jest pusty - ma w nim kilka (najwyraźniej znaczących) kluczy. –

+0

Wystarczająco fair. Jeśli usuniesz instrukcję (obj! = Null), to zadziała, ale zgaduję, że druga odpowiedź też zadziała ... – Reuben

+2

Właściwie, czy nie byłoby najlepiej połączyć powyższe podejście, które wykorzystuje ... z tym? Metoda for ... in approach mówi ci, jeśli masz w ogóle jakieś klucze, co jest ważne. Takie podejście może się nie powieść, jeśli masz klucz z wartością pustą. – scriptocalypse

1

Innym podejściem jest dodanie dyktowanego słowa słownikowego ["count"], które powtarza się za każdym razem, gdy dodajesz element do słownika i iteruje za każdym razem, gdy usuniesz element. Lub bardziej wyrafinowane rozwiązanie podklasy Dictionary i dodać właściwość push, pop i długość, które w zasadzie to samo.

2

A pusta/nie pusty szczególny przypadek wspomniany przez OP:

var empty:Boolean = true; 

for (var key:Object in dict) 
{ 
    empty = false; 
    break; 
} 

kodeksu jak to powinno iść w funkcji użyteczności zamiast powielać to wszystko na miejscu, więc w momencie użycia będzie oczywiste, co się dzieje.

0

Testowany i działający.
Lepsza przejrzystość poprzez unikanie negatywnego języka.

/** 
* @return Whether given Dictionary has content or is empty. 
*/ 
public function hasContent(dictionary:Dictionary):Boolean 
{ 
    for (var anything:Object in dictionary) 
     return true; 
    return false; 
}