在AS3中,您在哪里绘制Dictionary和ArrayCollection之间的界限?

时间:2012-12-03 21:10:17

标签: actionscript-3 flex dictionary containers arraycollection

基本上我一直在我的程序中使用一个Dictionary对象,它基本上把它作为密钥并在适当的位置存储了RTMFP对等ID。每个int都是唯一的,代表一个用户。

现在我需要扩展这一点,其中用户通过int和布尔值的组合来识别,类似这样:

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

只有这两者之间的组合才能真正唯一地标识用户。话虽这么说我正准备使用由此创建的新类用于Dictionary键;但后来发现我不是这样做,而是将对等ID添加到类定义中并将Dictionary对象转换为ArrayCollection:

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

所以现在我想知道在这种情况下哪个更好。而这个问题带来了一个更大的问题:你在哪里真正划分了这两种集合类型之间的界限?毕竟,他们突然开始似乎没有那么不同,除非你试图避免搞乱课堂定义。我想我真的在询问有关具体情况和一般问题的建议。谢谢!

2 个答案:

答案 0 :(得分:4)

ArrayCollection只是数组的包装器,仅在Flex中可用。

在AS3中,您确实有3种基本的哈希表类型:Array,Object和Dictionary。您可以根据要使用的键类型选择要使用的键:整数,字符串或对象引用。数组会将任何键转换为int,Object会将任何键转换为字符串。字典像字符串键一样工作(并将原语转换为字符串),但它真正擅长的是使用对象引用作为键。

您希望使用单个int作为唯一键,使用数组。如果要将单个字符串用作唯一键,请使用对象。如果要将对象引用用作唯一键,请使用Dictionary。

在您的情况下,您应该在“key”类上使用Object和自定义toString()方法。这是因为您希望使用原始值(不是对象引用)的组合作为唯一键。没有办法本地执行此操作,因此您必须将值作为单个字符串混合在一起。对象是字符串键的最佳(最快)哈希表,因此这是您应该使用的集合。

示例:

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)]); 

答案 1 :(得分:1)

DictionaryArrayCollection有一些重要的区别:

  • Dictionary将对象映射到其他对象,而ArrayCollection只是对象列表。
  • ArrayCollection仅限Flex,因此在通用AS3项目中无法使用。

您应该使用哪一个取决于您在应用中需要的内容:

  • 你会使用"身份"对象(用户ID和"是当前")在其他地方,没有关联的对等ID?在这种情况下,请将其设为单独的Identity类左右,并使用DictionaryIdentity个实例映射到对等ID。
  • 您是否需要根据身份执行查找?换句话说,您是否需要询问"哪个同伴ID与此身份相关联?"。如果是这样,请再次转到Dictionary + Identity,以避免在列表中循环。

我确定有更多的考虑事项,但这些应该让你开始。