所以我有一个NSDictionary
,其中键的年份为NSString
,每个键的值也是NSString
,这是一年的描述。例如,一个键是“943 B.C.”,另一个是“1886”。我遇到的问题是我想按升序自然地对它们进行排序。
事情是,这些年的数据来源已经是有序的,只是当我继续拨打setValue:forKey
时,命令自然会丢失。我想找出一种方法来对这些NSString
进行排序可能是一种痛苦,而我应该寻找一种在插入阶段保留顺序的方法。我该怎么办?我是否应该将其设为NSMutableArray
,其中每个对象实际上都是NSDictionary
,其中包含作为年份的关键字,而值是描述?
我想我只是回答了我自己的问题,但是为了避免这次浪费,我会留下这个,万一有人可以推荐一个更好的方法。
谢谢!
编辑:我继续使用自己的NSMutableArray
NSDictionary
条目来保存键/值对。这就是我以后访问这些信息的方式,希望我能正确地做到这一点:
// parsedData is the NSMutableArray which holdes the NSDictionary entries
for (id entry in parsedData) {
NSString *year = [[entry allKeys] objectAtIndex:0];
NSString *text = [entry objectForKey:year];
NSLog(@"Year: %@, Text: %@", year, text);
}
答案 0 :(得分:2)
除了保存所有键值对的NSMutableArray
之外,还要保持NSDictionary
按顺序存储键。
Here是一个类似的问题。
答案 1 :(得分:1)
您可以按照建议的方式将其作为字典数组,也可以作为字符串数组,其中字符串是原始字典的键。后者可能是一种更简单的方法。根据我的理解,NSDictionary不会维护其键的任何特定顺序,因此尝试对值进行排序可能是不明智的。
答案 2 :(得分:0)
我需要解决类似的问题来排序操作系统名称字符串,例如“Ubuntu 10.04(lucid)”。
在我的情况下,字符串可以具有任何值,因此我通过标记化和测试来排序,以查看令牌是否为数字。我也考虑像“8.04.2”这样的字符串被认为是一个数字,所以我有一个嵌套级别的标记。幸运的是,嵌套循环通常只有一次迭代。
这是来自即将推出的OpenStack iPhone应用程序。
- (NSComparisonResult)compare:(ComputeModel *)aComputeModel {
NSComparisonResult result = NSOrderedSame;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSArray *tokensA = [self.name componentsSeparatedByString:@" "];
NSArray *tokensB = [aComputeModel.name componentsSeparatedByString:@" "];
for (int i = 0; (i < [tokensA count] || i < [tokensB count]) && result == NSOrderedSame; i++) {
NSString *tokenA = [tokensA objectAtIndex:i];
NSString *tokenB = [tokensB objectAtIndex:i];
// problem: 8.04.2 is not a number, so we need to tokenize again on .
NSArray *versionTokensA = [tokenA componentsSeparatedByString:@"."];
NSArray *versionTokensB = [tokenB componentsSeparatedByString:@"."];
for (int j = 0; (j < [versionTokensA count] || j < [versionTokensB count]) && result == NSOrderedSame; j++) {
NSString *versionTokenA = [versionTokensA objectAtIndex:j];
NSString *versionTokenB = [versionTokensB objectAtIndex:j];
NSNumber *numberA = [formatter numberFromString:versionTokenA];
NSNumber *numberB = [formatter numberFromString:versionTokenB];
if (numberA && numberB) {
result = [numberA compare:numberB];
} else {
result = [versionTokenA compare:versionTokenB];
}
}
}
[formatter release];
return result;
}