排序NSStrings数字

时间:2010-01-03 06:08:07

标签: objective-c iphone sorting

所以我有一个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);
}

3 个答案:

答案 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;
    }