0

基本的に、私は自分のプログラムで Dictionary オブジェクトを使用してきました。このオブジェクトは、基本的に int をキーとして受け取り、RTMFP ピア ID を適切な場所に格納しました。各 int は一意であり、1 人のユーザーを表しています。

ここで、ユーザーが int とブール値の組み合わせで識別されるように、これを拡張する必要があります。次のようなものです。

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

この 2 つの組み合わせだけが、ユーザーを一意に識別します。そうは言っても、Dictionary キー用にこれから作成された新しいクラスを使用しようとしていました。しかし、このようにする代わりに、ピア ID をクラス定義に追加して、Dictionary オブジェクトを ArrayCollection に変換することもできると思いつきました。

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

ですから、このシナリオではどちらが本当に優れているのか疑問に思っています。そして、その疑問は、より大きな疑問へとつながりました。一般的に、これら 2 つのコレクション タイプの境界線はどこにあるのでしょうか? クラス定義をいじるのを避けようとしている場合を除いて、結局のところ、それらは突然それほど違いがないように見え始めています。特定のシナリオと一般的な質問の両方について、本当にアドバイスを求めていると思います。ありがとう!

4

2 に答える 2

4

ArrayCollection は配列の単なるラッパーであり、Flex でのみ使用できます。

AS3 には、配列、オブジェクト、辞書の 3 つの基本的なハッシュ テーブル タイプがあります。使用するキーのタイプ (整数、文字列、またはオブジェクト参照) に基づいて、使用するものを選択します。配列は任意のキーを int に変換し、オブジェクトは任意のキーを文字列に変換します。ディクショナリは、文字列キーのオブジェクトのように機能します (プリミティブを文字列に変換します) が、オブジェクト参照をキーとして使用することが本当に得意です。

単一の int を一意のキーとして使用する場合は、配列を使用します。単一の文字列を一意のキーとして使用する場合は、オブジェクトを使用します。オブジェクト参照を一意のキーとして使用する場合は、Dictionary を使用します。

あなたの場合、おそらくtoString()「キー」クラスでオブジェクトとカスタムメソッドを使用する必要があります。これは、プリミティブ値 (オブジェクト参照ではなく) の複合を一意のキーとして使用するためです。これをネイティブに行う方法はないため、値を 1 つの文字列としてマッシュアップする必要があります。オブジェクトは、文字列キーの最適な (最速の) ハッシュ テーブルであるため、これを使用する必要があります。

例:

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)]); 
于 2012-12-03T21:51:03.117 に答える
1

DictionaryArrayCollectionいくつかの重要な違いがあります:

  • Dictionaryオブジェクトを他のオブジェクトにマップしますが、ArrayCollectionは単なるオブジェクトのリストです。
  • ArrayCollectionFlexのみであるため、一般的なAS3プロジェクトでは使用できません。

どちらを使用するかは、アプリで必要なものによって異なります。

  • 関連付けられたピアIDなしで、別の場所で「identity」オブジェクト(ユーザーIDと「現在」)を使用しますか?その場合は、それを別Identityのクラス程度にし、を使用してインスタンスをピアIDDictionaryにマップします。Identity
  • IDに基づいてルックアップを実行する必要がありますか?つまり、「どのピアIDがこのIDに関連付けられているか」を尋ねる必要がありますか。その場合は、代わりにリストをループしないように、もう一度Dictionary+を選択してください。Identity

もっと考慮事項があると思いますが、これらはあなたが始めるのに役立つはずです。

于 2012-12-03T21:33:49.010 に答える