我用 10 个键创建了 NSMutableDictionary。现在我想以与添加到 NSMutableDictionary 相同的顺序访问 NSMutableDictionary 键(使用 SetValue:* forKey:* );
我怎样才能做到这一点?
我用 10 个键创建了 NSMutableDictionary。现在我想以与添加到 NSMutableDictionary 相同的顺序访问 NSMutableDictionary 键(使用 SetValue:* forKey:* );
我怎样才能做到这一点?
如果您绝对必须使用字典容器,则必须使用可按添加键值对的顺序排序的键。因此,在创建字典时,您使用一个自增整数或类似的键。然后,您可以对(整数)键进行排序并检索与这些键关联的值。
但是,如果您完成了所有这些操作,您也可以直接使用 anNSMutableArray
并将值添加到数组中!它会更快并且需要更少的代码。您只需按顺序检索对象:
for (id obj in myArray) { /* do stuff with obj... */ }
NSMutableDictionary
不能那样做。看看例如 Matt Gallaghers OrderedDictionary
。
我写了一个快速的方法来获取一个源数组(所有乱序的对象)和一个引用数组(它有一个期望(并且完全任意)顺序的对象),并返回一个数组,其中源数组的项目已重新组织以匹配参考数组。
- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
NSMutableArray *returnArray = [[NSMutableArray alloc] init];
for (int i = 0; i < [referenceArray count]; i++)
{
if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
{
[returnArray addObject:[arrReference objectAtIndex:i]];
}
}
return [returnArray copy];
}
请注意,这是非常脆弱的。它使用NSArray
'containsObject:
方法,最终将调用NSObject
'sisEqual:
。基本上,它应该适用于NSString
s、NSNumber
s 和可能NSDate
s 的数组(还没有尝试过),但除此之外,YMMV。我想如果你试图传递UITableViewCell
s 的数组或其他一些非常复杂的对象,它会完全 sh*t 本身,要么崩溃,要么返回全部垃圾。同样,如果您要执行类似传递NSDate
s 数组作为参考数组和NSString
s 数组作为源数组的操作。此外,如果源数组包含参考数组中未涵盖的项目,它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。
综上所述,如果您尝试做一些简单的事情,它应该可以很好地工作。在您的情况下,您可以在循环遍历setValue:forKey:
.
NSMutableArray *referenceArray = [[NSMutableArray alloc] init];
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init];
for (//whatever you are looping through here)
{
[yourDictionary setValue://whatever forKey:key];
[referenceArray addObject:key];
}
然后,当你想按照它们进入的顺序循环你的项目时,你只需
for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray])
实际上,您有一个有序的参考数组,那么为什么还要添加一个数组。所以我想这种方法不好。请考虑我的意见。
尽管@GenralMike 的回答轻而易举,但可以通过省略不必要的代码来优化它,如下所示:
1)保留一个数组以按添加顺序保存对字典键的引用。
NSMutableArray *referenceArray = [[NSMutableArray alloc] init];
NSMutableDictionary *yourDictionary = [[ NSMutableDictionary alloc] init];
for (id object in someArray) {
[yourDictionary setObject:object forKey:someKey];
[referenceArray addObject:someKey]; // add key to reference array
}
2) 现在“referenceArray”按顺序保存所有键,因此您可以按照最初添加到字典中的顺序从字典中检索对象。
for (NSString *key in referenceArray){
//get object from dictionary in order
id object = [yourDictionary objectForKey:key];
}