我有一个NSDictionary(存储在plist中),我基本上将其用作关联数组(字符串作为键和值).我想使用键数组作为我的应用程序的一部分,但我希望它们按特定的顺序排列(实际上不是我可以编写算法来对它们进行排序的顺序).我总是可以存储一个单独的键数组,但这似乎是一种kludgey因为我总是需要更新字典的键以及数组的值,并确保它们始终对应.目前我只使用[myDictionary allKeys],但显然这会以任意,无保证的顺序返回它们.Objective-C中是否存在我缺少的数据结构?有没有人对如何更优雅地做这个有任何建议?
这个答案显示NSDictionary的哈希值是字典中的条目数.(类似地,NSArray的散列是它的长度.)答案继续建议创建一个类别以提供更好的散列实现.
如果您需要更准确的哈希值,可以在Obj-C类别中自行提供.
但是当我尝试这个时,无论如何它似乎都使用了原始的哈希实现.
我们有标题 NSDictionary+Hash.h
#import <Foundation/Foundation.h>
@interface NSDictionary (Hash)
- (NSUInteger)hash;
@end
Run Code Online (Sandbox Code Playgroud)
并执行NSDictionary+Hash.m:
#import "NSDictionary+Hash.h"
@implementation NSDictionary (Hash)
- (NSUInteger)hash
{
// Based upon standard hash algorithm ~ https://stackoverflow.com/a/4393493/337735
NSUInteger result = 1;
NSUInteger prime = 31;
// Fast enumeration has an unstable ordering, so explicitly sort the keys
// https://stackoverflow.com/a/8529761/337735
for (id key in [[self allKeys] sortedArrayUsingSelector:@selector(compare:)]) {
id value = [self objectForKey:key];
// okay, so copying Java's hashCode a bit:
// …Run Code Online (Sandbox Code Playgroud)