【问题标题】:Sorting NSStrings of Numbers排序 NSStrings 的数字
【发布时间】:2010-01-03 06:08:07
【问题描述】:

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

【问题讨论】:

    标签: objective-c iphone sorting


    【解决方案1】:

    除了保存所有键值对的NSDictionary之外,还维护一个NSMutableArray来按顺序存储键。

    Here 是一个类似的问题。

    【讨论】:

      【解决方案2】:

      您可以按照您的建议将其作为字典数组来执行,也可以作为字符串数组来执行,其中字符串是原始字典的键。后者可能是一种更简单的方法。据我了解,NSDictionary 不会维护其键的任何特定顺序,因此尝试对其中的值进行排序可能是不明智的。

      【讨论】:

        【解决方案3】:

        我需要解决一个类似的问题来对操作系统名称的字符串进行排序,例如“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;
            }
        

        【讨论】:

          猜你喜欢
          • 2011-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多