Objective-C:在循环中从NSString中删除尾随逗号

时间:2014-02-27 21:09:12

标签: objective-c for-loop nsstring

在我的介绍性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);

4 个答案:

答案 0 :(得分:5)

更好的方法是这样的:

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);

答案 1 :(得分:1)

即使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);

答案 2 :(得分:0)

一种更有效的方法如下。使用自动参考计数(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),请在[outputString release];之后附加NSLog();

NSStringNSMutableString

在问题中给出的方法中,正在构建答案时重复创建NSString个对象。内存的分配和复制非常慢,另外因为开始生成的对象是自动释放的,所以每次循环迭代时内存使用都会增加,并且直到下一次自动释放池的消耗才会释放。相反,更好的解决方案是使用NSMutableStringNSStringNSUInteger的子类,用于变异/更改,并且可以更快地将字符附加到自身。

intint

在问题中给出的方法中,也使用NSInteger。最好使用NSUIntegerNSUInteger作为they avoid problems with execution on 32/64bit processors。由于没有负数,因此使用无符号变量({{1}})也是可取的,因为它给出了更大的正范围。

消息传递

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

答案 3 :(得分:0)

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

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