我有一个NSDictionary(存储在plist中),我基本上将其用作关联数组(字符串作为键和值).我想使用键数组作为我的应用程序的一部分,但我希望它们按特定的顺序排列(实际上不是我可以编写算法来对它们进行排序的顺序).我总是可以存储一个单独的键数组,但这似乎是一种kludgey因为我总是需要更新字典的键以及数组的值,并确保它们始终对应.目前我只使用[myDictionary allKeys],但显然这会以任意,无保证的顺序返回它们.Objective-C中是否存在我缺少的数据结构?有没有人对如何更优雅地做这个有任何建议?
具有关联的NSMutableArray键的解决方案并不是那么糟糕.它避免了子类化NSDictionary,如果你小心编写访问器,那么保持同步不应该太难.
我在游戏中遇到了实际答案,但您可能有兴趣调查CHOrderedDictionary.它是NSMutableDictionary的子类,它封装了另一个用于维护键排序的结构.(它是CHDataStructures.framework的一部分.)我发现它比分别管理字典和数组更方便.
披露:这是我写的开源代码.只是希望它对面临这个问题的其他人有用.
没有这样的内置方法可以从中获得这个.但是一个简单的逻辑工作对你而言.在准备字典时,您只需在每个键前添加一些数字文本即可.喜欢
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字符即可.
如果您要创建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种方法中的所有方法实现都将直接通过托管字典或订购的密钥数组.
我的小补充:按数字键排序(使用较小代码的简写符号)
// 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]]; }