基本上我一直在我的程序中使用一个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;
所以现在我想知道在这种情况下哪个更好。而这个问题带来了一个更大的问题:你在哪里真正划分了这两种集合类型之间的界限?毕竟,他们突然开始似乎没有那么不同,除非你试图避免搞乱课堂定义。我想我真的在询问有关具体情况和一般问题的建议。谢谢!
答案 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)
Dictionary
和ArrayCollection
有一些重要的区别:
Dictionary
将对象映射到其他对象,而ArrayCollection
只是对象列表。ArrayCollection
仅限Flex,因此在通用AS3项目中无法使用。您应该使用哪一个取决于您在应用中需要的内容:
Identity
类左右,并使用Dictionary
将Identity
个实例映射到对等ID。Dictionary
+ Identity
,以避免在列表中循环。我确定有更多的考虑事项,但这些应该让你开始。