我创建了带有10个密钥的NSMutableDictionary。现在我想以与添加到NSMutableDictionary相同的顺序访问NSMutableDictionary密钥(使用SetValue:* forKey:*);
我如何实现这一目标?
答案 0 :(得分:9)
如果绝对必须使用字典容器,则必须使用可按添加键值对的顺序排序的键。因此,在创建字典时,使用自动递增整数或类似的键。然后,您可以对(整数)键进行排序,并检索与这些键关联的值。
但是,如果您执行所有这些操作,您也可以使用NSMutableArray
并直接向数组添加值!它会更快,并且需要更少的代码。您只需按顺序检索对象:
for (id obj in myArray) { /* do stuff with obj... */ }
答案 1 :(得分:7)
NSMutableDictionary
无法做到这一点。看看例如Matt Gallaghers OrderedDictionary
。
答案 2 :(得分:2)
我编写了一个快速方法来获取源数组(对象全部乱序)和一个引用数组(具有所需(和完全任意)顺序的对象),并返回一个数组所在的数组已重新组织源数组以匹配引用数组。
- (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
的{{1}}方法,最终将调用NSObject
's isEqual:
。基本上,它应该适用于containsObject:
s,NSString
s和NSNumber
s(尚未尝试过那个)的数组,但除此之外,YMMV。我想如果你试图传递NSDate
s或其他一些非常复杂的对象的数组,那么它本身就会完全失败,并且会崩溃或返回总垃圾。同样,如果您要执行诸如传递UITableViewCell
s数组作为参考数组和NSDate
s数组作为源数组。此外,如果源数组包含引用数组中未涵盖的项,则它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。
所有这一切,如果你想做一些简单的事情,它应该很好地工作。在您的情况下,您可以在循环浏览NSString
时建立参考数组。
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];
}
答案 3 :(得分:0)
实际上你有一个参考数组按顺序排列,然后为什么你要添加一个数组。所以我觉得这种方法不好。请考虑我的意见。
答案 4 :(得分:0)
尽管@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];
}