2009-10-13 9 views
10

Flash implémente un dictionnaire (c'est-à-dire quelque chose comme un HashMap) en utilisant deux approches. Une approche est la classe flash.utils.Dictionary, et l'autre est un Object générique. Je voudrais vérifier le nombre de key:value paires dans le dictionnaire. Dans la plupart des cas, je voudrais simplement le savoir il ya key:value paires, c'est-à-dire, vérifiez simplement s'il est vide.AS3: Vérifier si un dictionnaire est vide

La documentation n'a pas beaucoup d'aide sur ce point. Existe-t-il un moyen simple et clair de le faire? A défaut, y a-t-il une façon laide, mais pas trop fragile de le faire?

Répondre

6

La seule façon qui vient à l'esprit est de parcourir toutes les clés et les compter - comme ceci:

var count:int = 0; 

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

boiteux Jolie - mais je pense que est ce que vous reste. Notez que le dictionnaire est juste un wrapper vraiment très mince pour l'objet vanille.

12

Cela vous dira sûrement si un dictionnaire particulier est vide:

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

Notez que vous devez faire le obj != null contrôle - même si vous définissez myDictionary[key] = null, il sera toujours itérer comme un objet nul, donc un La boucle for...in régulière ne fonctionnera pas dans cette instance. (Si vous utilisez toujours delete myDictionary[key], ça devrait aller).

+4

Cela semble être une solution pour les mauvaises pratiques. Supprimer une entrée du dictionnaire doit supprimer à la fois la clé et la valeur. Si pour une raison quelconque, je veux enlever la valeur mais laisser la touche, alors la dict n'est pas vraiment vide - elle a des clés (apparemment significatives). –

+0

Assez juste. Si vous supprimez l'instruction (obj! = Null), cela fonctionnera, mais je suppose que l'autre réponse fonctionnera aussi ... – Reuben

+2

En fait, ne serait-il pas préférable de combiner l'approche ci-dessus ... avec celui-ci? L'approche for ... in vous indique si vous avez des clés, ce qui est important. Cette approche peut échouer si vous avez une clé avec une valeur nulle. – scriptocalypse

1

Une autre approche consiste à ajouter une entrée de dictionnaire dict ["count"] qui se répète à chaque fois que vous ajoutez un élément au dictionnaire et qu'il se répète chaque fois que vous supprimez un élément. Ou une solution plus sophistiquée sous-classerait Dictionary et ajouterait push, pop, et une propriété de longueur qui fait essentiellement la même chose.

2

Et le cas vide/non vide spécial mentionné par l'OP:

var empty:Boolean = true; 

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

code comme celui-ci devrait aller dans une fonction d'utilité au lieu de le dupliquer dans tous les sens si au point d'utilisation, il sera évident ce qui se passe.

0

Testé et fonctionnel.
Clarté améliorée en évitant le langage négatif.

/** 
* @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; 
} 
Questions connexes