Actionscript 3 在AS3中,字典和ArrayCollection之间的界限在哪里?

Actionscript 3 在AS3中,字典和ArrayCollection之间的界限在哪里?,actionscript-3,apache-flex,dictionary,containers,arraycollection,Actionscript 3,Apache Flex,Dictionary,Containers,Arraycollection,基本上,我在我的程序中使用了一个Dictionary对象,它基本上将int作为键,并将RTMFP对等ID存储在适当的位置。每个int都是唯一的,代表一个用户 现在我需要扩展一下,用户是通过int和布尔值的组合来识别的,有点像这样: private var m_iUID:int; private var m_blnIsCurrent:Boolean; 只有这两者的结合才能真正唯一地识别用户。也就是说,我正要用一个新的类来制作字典键;但是我突然想到,我可以不这样做,而是将对等ID添加到类定义中,并

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

现在我需要扩展一下,用户是通过int和布尔值的组合来识别的,有点像这样:

private var m_iUID:int;
private var m_blnIsCurrent:Boolean;
只有这两者的结合才能真正唯一地识别用户。也就是说,我正要用一个新的类来制作字典键;但是我突然想到,我可以不这样做,而是将对等ID添加到类定义中,并将Dictionary对象转换为ArrayCollection:

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

所以现在我想知道,在这种情况下,哪一个更好。这个问题引出了一个更大的问题:一般来说,这两种收集类型之间的界限在哪里?它们突然开始看起来并没有什么不同,除非您试图避免弄乱类定义。我想我是在征求关于具体场景和一般问题的建议。谢谢

字典
数组集合
有一些重要的区别:

  • Dictionary
    将对象映射到其他对象,而
    ArrayCollection
    只是一个对象列表
  • ArrayCollection
    仅适用于Flex,因此在通用AS3项目中不可用
您应该使用哪一种取决于您在应用程序中需要什么:

  • 您是否会在其他地方使用“identity”对象(具有用户id和“is current”),而没有关联的对等id?在这种情况下,将其设置为一个单独的
    Identity
    类,并使用
    字典
    Identity
    实例映射到对等ID
  • 是否需要基于身份执行查找?换句话说,您是否需要询问“哪个对等id与此标识关联?”。如果是这样,请再次选择
    字典
    +
    标识
    ,以避免在列表中循环

我相信还有更多的注意事项,但这些应该让您开始。

字典
数组集合
有一些重要的区别:

  • Dictionary
    将对象映射到其他对象,而
    ArrayCollection
    只是一个对象列表
  • ArrayCollection
    仅适用于Flex,因此在通用AS3项目中不可用
您应该使用哪一种取决于您在应用程序中需要什么:

  • 您是否会在其他地方使用“identity”对象(具有用户id和“is current”),而没有关联的对等id?在这种情况下,将其设置为一个单独的
    Identity
    类,并使用
    字典
    Identity
    实例映射到对等ID
  • 是否需要基于身份执行查找?换句话说,您是否需要询问“哪个对等id与此标识关联?”。如果是这样,请再次选择
    字典
    +
    标识
    ,以避免在列表中循环

我确信还有更多的注意事项,但这些应该让您开始。

ArrayCollection只是数组的包装,并且仅在Flex中可用

在AS3中,实际上有3种基本的哈希表类型:数组、对象和字典。根据要使用的键的类型选择要使用的键:整数、字符串或对象引用。数组将任何键转换为int,对象将任何键转换为字符串。字典的工作原理类似于字符串键的对象(并将原语转换为字符串),但它真正擅长的是使用对象引用作为键

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

在您的情况下,您可能应该在“key”类上使用一个对象和一个自定义的
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)]); 

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

在AS3中,实际上有3种基本的哈希表类型:数组、对象和字典。根据要使用的键的类型选择要使用的键:整数、字符串或对象引用。数组将任何键转换为int,对象将任何键转换为字符串。字典的工作原理类似于字符串键的对象(并将原语转换为字符串),但它真正擅长的是使用对象引用作为键

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

在您的情况下,您可能应该在“key”类上使用一个对象和一个自定义的
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)]); 

想想看,仅仅因为两个对象中的值相等并不意味着这两个对象相等——这可能会把字典搞乱。我怎样才能避开这个问题?@Panzercrisis看看我的答案,它解决了这个问题。是的,当使用
字典时,你的应用程序将