我已经建立的NSMutableDictionary用10 keys.Now我想要访问在同一顺序的NSMutableDictionary密钥,因为它被添加到的NSMutableDictionary(使用的SetValue:* forKey:*);
我怎样才能做到这一点?
我已经建立的NSMutableDictionary用10 keys.Now我想要访问在同一顺序的NSMutableDictionary密钥,因为它被添加到的NSMutableDictionary(使用的SetValue:* forKey:*);
我怎样才能做到这一点?
如果你绝对必须使用字典的容器,你必须使用一个密钥是在其中添加键值对的顺序排序。 因此,在创建字典时,您可以使用一键即自动递增的整数或相似。 然后,您可以排序(整数)键和检索与这些键关联的值。
如果你做了这一切,但是,你可能也只是使用NSMutableArray
,并添加值直接在阵! 这将是更快,需要更少的代码。 你只是为了取回对象:
for (id obj in myArray) { /* do stuff with obj... */ }
NSMutableDictionary
不能做到这一点。 看看如马特加拉格尔斯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
的isEqual:
。 基本上,它应该对数组工作带来极大NSString
S, NSNumber
S,也许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];
}
然后,当你要循环的顺序您的项目,他们进来的时候,你只
for (NSString *key in [self reorderArray:[myDict allKeys] toArray:referenceArray])
其实你有才能的方式引用数组,那么你为什么要添加到一个更array.So我想这种做法是不是good.Please考虑我的意见。
虽然@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];
}