如何在Objective-C中从收集结束而不是从开始实现for-in循环?
我正在尝试通过for-in循环迭代NSDictionary。但我希望它从这个集合的末尾开始迭代到它的开始。如何实现此恢复?NSDictionary是一个无序的数据结构。没有正向迭代或反向迭代的概念 在foreach循环中调用NSDictionary时,您正在对无序的键列表进行迭代。当迭代无序列表时,顺序是未定义的,因此颠倒顺序也是未定义的。这就好比把一副牌撒在地板上,然后让别人倒序 假设您的密钥有数字、字母等顺序层次结构,您可以取而代之的是获取密钥集合,并将其按特定顺序排序,然后迭代密钥集合,或者反向迭代该密钥集合。但是,如果这是您经常执行的操作,那么我怀疑NSDictionary不是解决您问题的数据结构的最佳选择。NSDictionary是一种无序的数据结构。没有正向迭代或反向迭代的概念如何在Objective-C中从收集结束而不是从开始实现for-in循环?,objective-c,ios,for-in-loop,Objective C,Ios,For In Loop,我正在尝试通过for-in循环迭代NSDictionary。但我希望它从这个集合的末尾开始迭代到它的开始。如何实现此恢复?NSDictionary是一个无序的数据结构。没有正向迭代或反向迭代的概念 在foreach循环中调用NSDictionary时,您正在对无序的键列表进行迭代。当迭代无序列表时,顺序是未定义的,因此颠倒顺序也是未定义的。这就好比把一副牌撒在地板上,然后让别人倒序 假设您的密钥有数字、字母等顺序层次结构,您可以取而代之的是获取密钥集合,并将其按特定顺序排序,然后迭代密钥集合,或
NSArray * a = @[@"a",@"b",@"c"];
NSArray * b = [[a reverseObjectEnumerator] allObjects];
for (NSString * obj in b) {
NSLog(@"%@",obj);
}
在foreach循环中调用NSDictionary时,您正在对无序的键列表进行迭代。当迭代无序列表时,顺序是未定义的,因此颠倒顺序也是未定义的。这就好比把一副牌撒在地板上,然后让别人倒序
假设您的密钥有数字、字母等顺序层次结构,您可以取而代之的是获取密钥集合,并将其按特定顺序排序,然后迭代密钥集合,或者反向迭代该密钥集合。但是,如果这是您经常执行的操作,那么我怀疑NSDictionary不是解决您的问题的数据结构的最佳选择
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];
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]);
}
打印c、b、a。
尝试按如下方式反转字典的键:
NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
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]);
}
嗯。。。问题是,字典本质上是无序的 因此,一个可能的解决方案是使用键创建一个NSArray,使用reverseObjectEnumerator反转该数组,然后在该数组上创建一个循环,并使用字典上的键 大概是这样的:
NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
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]);
}
日志是:
第三值
第二价值
第一价值
第一价值
第二价值
第三值
嗯。。。问题是,字典本质上是无序的 因此,一个可能的解决方案是使用键创建一个NSArray,使用reverseObjectEnumerator反转该数组,然后在该数组上创建一个循环,并使用字典上的键 大概是这样的:
NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects];
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]);
}
日志是:
第三值
第二价值
第一价值
第一价值
第二价值
第三值
首先对键进行排序,然后进行反向排序。否则,只要您向NSDictionary添加元素,它就会完全改变顺序。这并不能回答问题。问题是试图对字典进行反向迭代,因为字典没有顺序的概念,所以一开始就没有任何意义。您的数组解决方案不适用于此问题。请先对键进行排序,然后再进行反向排序。否则,只要您向NSDictionary添加元素,它就会完全改变顺序。这并不能回答问题。问题是试图对字典进行反向迭代,因为字典没有顺序的概念,所以一开始就没有任何意义。您的阵列解决方案不适用于此问题。确定。但当我用JSON动态地向it消息流中添加数据时,我看到它们是按照我添加它们的顺序出现的。因此,我想以某种方式迭代NSDictionary并捕获最后一个消息结构,其中的特定标志设置为1。所以我需要从头开始迭代,对吗?或者可能有更符合逻辑的方法-我是Objective-C world的新手。顺序未定义,您不能期望密钥集合中的最后一个密钥是插入到NSDictionary中的最后一个元素。如果您知道您需要最后一条标志设置为1的消息,那么您是否可以在收到消息时检查每条消息,如果它的标志设置为1,请将其存储在NSDictionary之外的某个人?这样,您就可以快速访问标志为1Ok的最后一条消息。但当我用JSON动态地向it消息流中添加数据时,我看到它们是按照我添加它们的顺序出现的。因此,我想以某种方式迭代NSDictionary并捕获最后一个消息结构,其中的特定标志设置为1。所以我需要从头开始迭代,对吗?或者可能有更符合逻辑的方法-我是Objective-C world的新手。顺序未定义,您不能期望密钥集合中的最后一个密钥是插入到NSDictionary中的最后一个元素。如果您知道您需要最后一条标志设置为1的消息,那么您是否可以在收到消息时检查每条消息,如果它的标志设置为1,请将其存储在NSDictionary之外的某个人?这样,您就可以快速访问标志为1的最后一条消息