Actionscript 3 在AS3中,字典和ArrayCollection之间的界限在哪里?
基本上,我在我的程序中使用了一个Dictionary对象,它基本上将int作为键,并将RTMFP对等ID存储在适当的位置。每个int都是唯一的,代表一个用户 现在我需要扩展一下,用户是通过int和布尔值的组合来识别的,有点像这样: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添加到类定义中,并
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
仅适用于Flex,因此在通用AS3项目中不可用ArrayCollection
- 您是否会在其他地方使用“identity”对象(具有用户id和“is current”),而没有关联的对等id?在这种情况下,将其设置为一个单独的
类,并使用Identity
将字典
实例映射到对等IDIdentity
- 是否需要基于身份执行查找?换句话说,您是否需要询问“哪个对等id与此标识关联?”。如果是这样,请再次选择
+字典
,以避免在列表中循环标识
我相信还有更多的注意事项,但这些应该让您开始。
字典
和数组集合
有一些重要的区别:
将对象映射到其他对象,而Dictionary
只是一个对象列表ArrayCollection
仅适用于Flex,因此在通用AS3项目中不可用ArrayCollection
- 您是否会在其他地方使用“identity”对象(具有用户id和“is current”),而没有关联的对等id?在这种情况下,将其设置为一个单独的
类,并使用Identity
将字典
实例映射到对等IDIdentity
- 是否需要基于身份执行查找?换句话说,您是否需要询问“哪个对等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看看我的答案,它解决了这个问题。是的,当使用
字典时,你的应用程序将