【问题标题】:Objective-C: Removing trailing comma from NSString in a loopObjective-C:在循环中从 NSString 中删除尾随逗号
【发布时间】:2014-03-31 14:04:32
【问题描述】:

这是我的入门 Objc 课程中的一个简单挑战,这让我很伤心。我已经尝试了一些我在 X-code API 中找到的东西来尝试解决这个问题,但我没有运气。挑战规范包括一个限制:我不能更改 for 循环之外的任何代码,并且我的输出不能包含尾随逗号。在当前的迭代中确实如此,但我不知道如何摆脱它!

这是当前形式的代码:

    NSString *outputString = @"";
    int loopMaximum = 10;

    for (int counter = 1; counter <= loopMaximum; counter++) {
        outputString = [NSString stringWithFormat:@"%@ %d,", outputString, counter];
        //Not sure how to get rid of trailing comma =/
    }

    NSLog(@"%@", outputString);

【问题讨论】:

  • 尝试在您添加的新数字前添加一个逗号,除非您处于循环的第一次迭代中,您可以通过检查计数器的值来检查,或者通过检查 outputString 的长度是否为零。
  • 您确定要以空格字符开头吗? ;-)

标签: objective-c for-loop nsstring


【解决方案1】:

更好的方法是这样的:

NSMutableString *outputString = [NSMutableString string];
int loopMaximum = 10;

for (int counter = 1; counter <= loopMaximum; counter++) {
    if (counter > 1) {
        [outputString appendString:@", "];
    }
    [outputString appendFormat:@"%d", counter];
}

NSLog(@"%@", outputString);

【讨论】:

  • 无数类似解决方案之一。请记住,这缺少领先的空格字符 - 这可能是一个很好的选择。 :)
  • 如果 OP“不能更改 for 循环之外的任何代码”,则此解决方案不正确。
  • 我承认我没有看到这个要求。但这是一个愚蠢的要求。为什么要在循环中编写 hacky 代码以避免以正确的方式进行操作?
  • 为什么?因为限制就是限制。
【解决方案2】:

即使 rmaddy 的解决方案内存效率更高,OP 表示不允许他在“for 循环”之外更改代码:

所以这是一个有效的解决方案:

NSString *outputString = @"";
int loopMaximum = 10;

for (int counter = 1; counter <= loopMaximum; counter++) {
    outputString = [NSString stringWithFormat:@"%@%d%@", outputString, counter, (counter<loopMaximum)?@", ":@""];
}

NSLog(@"%@", outputString);

【讨论】:

    【解决方案3】:

    一种更有效的方法如下。使用自动引用计数 (ARC),

    NSMutableString *outputString = [[NSMutableString alloc] init];
    NSUInteger loopMaximum = 10;
    
    for (NSUInteger counter = 1; counter <= loopMaximum; counter++)  
    {
        if (counter == 1)
        {
            [outputString appendFormat:@"%d", counter];
            continue;
        }
    
        [outputString appendFormat:@", %d", counter];
    }
    
    NSLog(@"%@", outputString);
    

    对于手动引用计数 (MRC),在 NSLog(); 之后附加 [outputString release];

    NSStringNSMutableString

    在问题中给出的方法中,在构建答案时会重复创建 NSString 对象。内存的分配和复制非常慢,另外由于开始生成的对象是自动释放的,每次循环迭代时内存使用量都会增加,并且直到下一次自动释放池耗尽时才会释放。相反,更好的解决方案是使用NSMutableString,它是NSString 的子类,旨在进行变异/更改,并且在将字符附加到自身时要快得多。

    NSUIntegerint

    在问题中给出的方法中,还使用了int。最好使用NSIntegerNSUInteger 作为they avoid problems with execution on 32/64bit processors。由于没有负数,因此最好使用无符号变量 (NSUInteger),因为它可以提供更大的正数范围。

    消息传递

    传递消息可能会变得昂贵,尤其是在迭代时。通过将每次迭代传递的消息数量限制为 1,它可以减少产生的开销。

    【讨论】:

    • 如果 OP“不能更改 for 循环外的任何代码”,则此解决方案不正确。
    【解决方案4】:

    只需创建一个子字符串即可修剪最后一个字符。

    string = [string substringToIndex:[string length] - 1];
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多