【问题标题】:How can I convert an NSRange to a delimited string of its values?如何将 NSRange 转换为其值的分隔字符串?
【发布时间】:2014-05-12 18:52:48
【问题描述】:

给定一个 NSRange,例如:

NSRange range = NSMakeRange(1, 22);

将其转换为以逗号分隔的值字符串的最佳方法是什么?

@"1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22"

我能想到的最好办法是遍历该范围并将其值插入 NSArray,然后在该数组上调用 -componentsJoinedByString:。但这似乎很浪费,更不用说不雅了。有没有更好的办法?

【问题讨论】:

  • 我不知道。这不是蟒蛇。 ;)
  • @dasdom 所以你知道我来自哪里,嗯?我习惯了它很容易:perl -E 'say join ",", 1..22'
  • NSMutableString *string = [[NSMutableString alloc] init];for (int i = range.location; i < range.length; i ++){[string appendFormat:"%d,",i]};[string deleteCharactersInRange:NSMakeRange(string.length-1,1)]; ?这就是你要找的东西?
  • @Larme 是的,就像 J2thC 的回答一样。不过太丑了。
  • 类似/相关:Looping using NSRange(请注意那里也提到了 Python!)

标签: objective-c loops csv nsstring nsrange


【解决方案1】:

我使用数组的版本:

NSMutableArray *vals = [NSMutableArray arrayWithCapacity:range.length];
for (NSUInteger i = range.location; i < range.length; i++){
    [vals addObject:@(i)];
}
NSString *string = [vals componentsJoinedByString:@","];

【讨论】:

    【解决方案2】:

    您可以使用 NSIndexSet 和 indexSetWithIndexesInRange: 来生成值列表,然后使用 enumerateIndexesUsingBlock: 遍历它们。例如

    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];
    NSMutableArray *indices = [NSMutableArray array];
    [indexSet enumerateIndexesUsingBlock:^(NSUInteger i, BOOL *stop) {
        [indices addObject:@(i)];
    }];
    NSString *string = [indices componentsJoinedByString:","];
    

    【讨论】:

    • 也许我应该寻求越来越复杂的方法来解决这个问题。 ;-P
    • 哈。这就是我能想到的 :) 我认为可能有一种方法可以将 NSIndexSet 转换为填充有元素索引的 NSArray,但是,唉,没有骰子。 NSIndexSet 基本上是 NSRange 的更高级别版本,所以我的回答并没有太大的好处,除非你不想直接使用 NSRange。
    【解决方案3】:
    NSMutableString *string=[@"" mutableCopy];
    for (int i = range.location; i<range.length-1; i++){
       [string appendFormat:@"%d,", i];
    }
    [string appendString@"%d", range.length-1];
    

    如果你想隐藏代码,你可以把它变成一个函数,把这个范围变成一个字符串,这样你的代码就隐藏了。或者也许把它变成一个NSString 类方法,比如

    [NSString stringWithRangeValues:range];
    

    那就是:

    + (NSString *)stringWithRangeValues:(NSRange)range{
            NSMutableString *string=[@"" mutableCopy];
            for (int i = range.location; i<range.lenght-1; i++){
               [string appendFormat:@"%d,", i];
            }
            [string appendString@"%d", range.length-1];
            return [NSString stringWithString:string];
    

    }

    【讨论】:

    • 是的,我注意到并删除了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2019-08-23
    • 2016-06-07
    相关资源
    最近更新 更多