0

基本上,我一直在我的程序中使用一个 Dictionary 对象,该对象基本上将整数作为其键,并将 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;

所以现在我想知道在这种情况下哪个更好。这个问题引出了一个更大的问题:一般而言,您在哪里真正划定这两种集合类型之间的界限?毕竟它们突然开始看起来并没有那么不同,除非你试图避免弄乱类定义。我想我真的在就具体情况和一般问题征求意见。谢谢!

4

2 回答 2

4

ArrayCollection 只是一个 Array 的包装器,并且仅在 Flex 中可用。

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

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

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

Dictionary并且ArrayCollection有一些重要的区别:

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

您应该使用哪一个实际上取决于您在应用程序中需要什么:

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

我敢肯定还有更多考虑因素,但是这些应该可以帮助您入门。

于 2012-12-03T21:33:49.010 回答