2009-10-13 24 views
10

Flashは、2つのアプローチを使用して辞書(つまり、HashMapのようなもの)を実装します。 1つのアプローチはflash.utils.Dictionaryクラスであり、もう1つは汎用Objectです。私はどのくらいの数のkey:valueペアが辞書に入っているかチェックしたいと思います。ほとんどの場合、私は単にkey:valueのペアがあることを知りたい、つまりそれが空であるかどうかをチェックするだけです。AS3:辞書が空であることを確認する

この点については、あまり参考になっていません。これを行う簡単で明確な方法はありますか?それに失敗すると、これを行うには醜い、まだ脆くない方法はありますか?

答えて

6

頭に浮かぶ唯一の方法は、すべてのキーを反復処理し、それらを数えることである - ので、のような:

var count:int = 0; 

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

かなりラメ - しかし、私はそれはあなたがが残っているものだと思います。ディクショナリはバニラオブジェクトの本当に本当に薄いラッパーにすぎないことに注意してください。

12

特定の辞書が空である場合、これは確実にあなたを教えてくれます:あなたはobj != nullチェックを行う必要があり

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

注 - myDictionary[key] = nullを設定した場合でも、それはまだそう、nullオブジェクトとして反復しますその場合、通常のfor...inループは機能しません。 (もしあなたが常にdelete myDictionary[key]を使用しているなら、あなたはうまくいくはずです)。

+4

これは悪い習慣の解決策のようです。ディクショナリからエントリを削除すると、キーと値の両方が削除されます。なんらかの理由で値を削除したいが、キーを残したいのであれば、dictは実際には空ではありません - それはいくつかの(明らかに意味のある)キーを持っています。 –

+0

十分な公正。 (obj!= null)文を削除すると、これはうまくいくが、私は他の答えがあまりにもうまくいくと推測している。 – Reuben

+2

実際には、上記のアプローチを組み合わせるのが最善ではないだろう...これで? for ... inのアプローチでは、鍵があるかどうかを知ることができます。重要です。この方法は、値がnullのキーがあると失敗する可能性があります。 – scriptocalypse

1

もう1つの方法は、項目を辞書に追加するたびに反復し、項目を削除するたびに反復する辞書項目dict ["count"]を追加することです。または、より洗練されたソリューションは、サブクラスのサブクラスで、基本的に同じことを行うプッシュ、ポップ、および長さのプロパティを追加します。

2

そしてOPで述べた空/空でない特殊なケース:それはなります使用の時点でのような場所の上にすべてを複製するのではなく、効用関数に行くべきこのような

var empty:Boolean = true; 

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

コード明らかに何が起こっているのか。

0

テスト済みです。
負の言語を避けることで透明性が向上しました。

/** 
* @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; 
} 
関連する問題