当前位置:  开发笔记 > 编程语言 > 正文

带有序键的NSDictionary

如何解决《带有序键的NSDictionary》经验,为你挑选了5个好方法。

我有一个NSDictionary(存储在plist中),我基本上将其用作关联数组(字符串作为键和值).我想使用键数组作为我的应用程序的一部分,但我希望它们按特定的顺序排列(实际上不是我可以编写算法来对它们进行排序的顺序).我总是可以存储一个单独的键数组,但这似乎是一种kludgey因为我总是需要更新字典的键以及数组的值,并确保它们始终对应.目前我只使用[myDictionary allKeys],但显然这会以任意,无保证的顺序返回它们.Objective-C中是否存在我缺少的数据结构?有没有人对如何更优雅地做这个有任何建议?



1> Abizern..:

具有关联的NSMutableArray键的解决方案并不是那么糟糕.它避免了子类化NSDictionary,如果你小心编写访问器,那么保持同步不应该太难.


一个缺陷是NS(Mutable)Dictionary创建了密钥的副本,因此密钥数组中的对象将是不同的.如果密钥发生变异,这可能会有问题.
顺便说一句,如果我听起来过于批评,我表示歉意.我自己一直在处理同样的问题,但由于它是一个框架,我试图将其设计为在每种可能的情况下都是健壮和正确的.你是对的,单独的数组不是那么糟糕,但它并不像为你追踪它的类那么简单.另外,如果这样的类扩展了NS(Mutable)Dictionary,有许多好处,因为它可以在需要Cocoa字典的任何地方使用.

2> Quinn Taylor..:

我在游戏中遇到了实际答案,但您可能有兴趣调查CHOrderedDictionary.它是NSMutableDictionary的子类,它封装了另一个用于维护键排序的结构.(它是CHDataStructures.framework的一部分.)我发现它比分别管理字典和数组更方便.

披露:这是我写的开源代码.只是希望它对面临这个问题的其他人有用.


链接坏了.
这不仅仅是缺少有序字典,而是缺少许多有用的CS101集合.我不相信Objective-C在没有Apple的情况下会成为一种广泛成功的语言,而不是C,C++,Java,C#,它们已被证明在其创作者的范围之外多次成功.

3> Rajan Twanab..:

没有这样的内置方法可以从中获得这个.但是一个简单的逻辑工作对你而言.在准备字典时,您只需在每个键前添加一些数字文本即可.喜欢

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
                       @"01.Created",@"cre",
                       @"02.Being Assigned",@"bea",
                       @"03.Rejected",@"rej",
                       @"04.Assigned",@"ass",
                       @"05.Scheduled",@"sch",
                       @"06.En Route",@"inr",
                       @"07.On Job Site",@"ojs",
                       @"08.In Progress",@"inp",
                       @"09.On Hold",@"onh",
                       @"10.Completed",@"com",
                       @"11.Closed",@"clo",
                       @"12.Cancelled", @"can",
                       nil]; 

现在,如果您可以使用sortingArrayUsingSelector,同时获得与您放置的顺序相同的所有键.

NSArray *arr =  [[dict allKeys] sortedArrayUsingSelector:@selector(localizedStandardCompare:)];

在你想要在UIView中显示键的地方,只需砍掉正面3字符即可.



4> Ashley Clark..:

如果您要创建NSDictionary的子类,则需要至少实现这些方法:

的NSDictionary

-count

-objectForKey:

-keyEnumerator

的NSMutableDictionary

-removeObjectForKey:

-setObject:forKey:

NSCopying/NSMutableCopying

-copyWithZone:

-mutableCopyWithZone:

NSCoding

-encodeWithCoder:

-initWithCoder:

NSFastEnumeration (适用于Leopard)

-countByEnumeratingWithState:objects:count:

做你想做的最简单的方法是创建一个NSMutableDictionary的子类,它包含它操作的'自己的NSMutableDictionary,以及一个NSMutableArray来存储一组有序的键.

如果你永远不会对你的对象进行编码,你可以想象跳过实现-encodeWithCoder:-initWithCoder:

然后,上述10种方法中的所有方法实现都将直接通过托管字典或订购的密钥数组.


还有一个是不明显的并且让我绊倒了 - 如果你实现了NSCoding,还要覆盖 - (Class)classForKeyedArchiver来返回[self class].类集群将此设置为始终返回抽象父类,因此除非您更改它,否则实例将始终解码为NS(可变)字典.

5> BananaAcid..:

我的小补充:按数字键排序(使用较小代码的简写符号)

// the resorted result array
NSMutableArray *result = [NSMutableArray new];
// the source dictionary - keys may be Ux timestamps (as integer, wrapped in NSNumber)
NSDictionary *dict =
@{
  @0: @"a",
  @3: @"d",
  @1: @"b",
  @2: @"c"
};

{// do the sorting to result
    NSArray *arr = [[dict allKeys] sortedArrayUsingSelector:@selector(compare:)];

    for (NSNumber *n in arr)
        [result addObject:dict[n]];
}

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有