代码之家  ›  专栏  ›  技术社区  ›  Jorge Israel Peña

对数字串进行排序

  •  0
  • Jorge Israel Peña  · 技术社区  · 15 年前

    所以我有一个 NSDictionary 那里的钥匙是多年的 NSString ,并且每个键的值也是 这是对这一年的描述。例如,一个键是“公元前943年”,另一个键是“1886年”。我遇到的问题是,我想自然地按升序对它们进行排序。

    问题是这些年的数据来源已经准备好了,只是当我继续打电话的时候 setValue:forKey 订单自然会丢失。我想找出一种方法来分类这些 这可能是一种痛苦,相反,我应该寻找一种在插入阶段保持顺序的方法。我该怎么办?我应该把它变成一个 NSMutableArray 其中每个对象实际上都是一个 字典 由年份键和描述值组成?

    我想我只是回答了我自己的问题,但为了避免浪费时间,我将把这个问题留着,以防有人能推荐一个更好的方法。

    谢谢

    编辑 可变数组 具有 用于保存键/值对的条目。这就是我以后访问信息的方式,希望我做得正确:

    // 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 回复  |  直到 15 年前
        1
  •  1
  •   Noah Witherspoon    15 年前

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

        2
  •  2
  •   Community CDub    8 年前

    维持 NSMutableArray NSDictionary 它保存所有键值对。

    Here

        3
  •  0
  •   greenisus    14 年前

    我需要解决一个类似的问题,对操作系统名称的字符串进行排序,例如“Ubuntu 10.04(lucid)”。

    这是来自即将推出的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;
        }