我正在尝试通过 for in 循环迭代 NSDictionary。但我希望它从这个集合的末尾开始迭代到它的开头。我怎样才能实现这种回归?
问问题
1134 次
3 回答
7
NSDictionary
是无序的数据结构。没有前向迭代或后向迭代的概念。
当您在 foreach 循环中调用 NSDictionary 时,您正在迭代一个无序列表的键。迭代无序列表时,顺序未定义,因此颠倒顺序也是如此。这类似于将一副纸牌散落在地板上,然后要求某人颠倒顺序。
假设您的键有一些顺序层次结构(数字、字母等),您可以获取键集合,并将其排序为特定顺序,然后迭代键集合,或反向迭代。但是,如果这是您经常执行的操作,那么我怀疑这NSDictionary
不是解决您的问题的数据结构的最佳选择。
于 2012-11-30T17:28:40.543 回答
6
嗯...问题是 NSDictionary 本质上是无序的。
因此,一个可能的解决方案是用键创建一个 NSArray,用“reverseObjectEnumerator”反转该数组,然后在数组上循环并使用字典上的键。
像这样的东西:
NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"firstValue",@"firstKey",
@"secondValue",@"secondKey",
@"thirdValue",@"thirdKey",
nil];
NSArray *keysNormal = [_dict allKeys];
NSArray *keysReversed = [[[_dict allKeys] reverseObjectEnumerator] allObjects];
for(NSString *str in keysNormal)
{
NSLog(@"%@", [_dict objectForKey:str]);
}
for(NSString *str in keysReversed)
{
NSLog(@"%@", [_dict objectForKey:str]);
}
日志是:
- 第三值
- 秒值
- 第一值
- 第一值
- 秒值
- 第三值
于 2012-11-30T17:34:54.167 回答
1
NSArray * a = @[@"a",@"b",@"c"];
NSArray * b = [[a reverseObjectEnumerator] allObjects];
for (NSString * obj in b) {
NSLog(@"%@",obj);
}
打印 c,b,a。尝试像这样反转字典的键:
NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
于 2012-11-30T17:29:06.220 回答