2009-10-13 4 views
10

Flash implementa un dizionario (ovvero una specie di HashMap) utilizzando due approcci. Un approccio è la classe flash.utils.Dictionary e l'altro è un generico Object. Vorrei verificare quante coppie key:value sono nel dizionario. Nella maggior parte dei casi mi piacerebbe semplicemente sapere che ci sono qualsiasi coppiakey:value, cioè, basta controllare se è vuoto.AS3: verificare se un dizionario è vuoto

La documentazione non è stata di grande aiuto su questo punto. C'è un modo semplice e chiaro per fare questo? In caso contrario, c'è un modo brutto, ma non troppo fragile per farlo?

risposta

6

L'unico modo che mi viene in mente è quello di scorrere tutte le chiavi e le considero - in questo modo:

var count:int = 0; 

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

piuttosto inconsistente - ma penso che è quello che si sono lasciati con. Si noti che il dizionario è solo un involucro davvero molto sottile per l'oggetto vaniglia.

12

Questo vi affidabile vi dirà se un dizionario particolare, è vuota:

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

Nota che è necessario fare il controllo obj != null - anche se si imposta myDictionary[key] = null, sarà ancora iterare come un oggetto nullo, quindi un il ciclo regolare for...in non funzionerà in quell'istanza. (Se si utilizza sempre delete myDictionary[key] si dovrebbe andare bene però).

+4

Questa sembra una soluzione per le cattive pratiche. La rimozione di una voce dal dizionario dovrebbe rimuovere sia la chiave che il valore. Se per qualche ragione, voglio rimuovere il valore ma lasciare la chiave, allora il dict non è veramente vuoto - ha alcune chiavi (apparentemente significative) in esso. –

+0

Abbastanza giusto. Se rimuovi l'istruzione (obj! = Null) allora funzionerà, ma suppongo che anche l'altra risposta funzionerà ... – Reuben

+2

In realtà, non sarebbe meglio combinare l'approccio sopra che usa per ... con questo? L'approccio for ... ti dice se hai qualche chiave, il che è importante. Questo approccio può fallire se si ha una chiave con un valore nullo. – scriptocalypse

1

Un altro approccio consiste nell'aggiungere una voce di dizionario dict ["count"] che itera ogni volta che si aggiunge un elemento al dizionario e si scorre ogni volta che si elimina un elemento. Oppure una soluzione più sofisticata sottoclasse il dizionario e aggiunge push, pop e una proprietà length che fondamentalmente fa la stessa cosa.

2

E l'/ caso speciale non vuoto vuoto fornita dal OP:

var empty:Boolean = true; 

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

codice come questo dovrebbe andare in una funzione di utilità anziché duplicare esso dappertutto quindi al punto di utilizzo sarà ovvio cosa sta succedendo.

0

Testato e funzionante.
La chiarezza è stata migliorata evitando il linguaggio negativo.

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