代码之家  ›  专栏  ›  技术社区  ›  Sergio Acosta

通过重复另一个字符串给定次数来创建NSString

  •  59
  • Sergio Acosta  · 技术社区  · 17 年前

    这应该很容易,但我很难找到最简单的解决方案。

    我需要一个 NSString 这等于另一个字符串与自身连接给定次数。

    为了更好地解释,请考虑以下python示例:

    >> original = "abc"
    "abc"
    >> times = 2
    2
    >> result = original * times
    "abcabc"
    

    有什么提示吗?


    编辑:

    我打算发布一个类似于以下内容的解决方案 Mike McMaster's answer ,在查看了OmniFrameworks的实现后:

    // returns a string consisting of 'aLenght' spaces
    + (NSString *)spacesOfLength:(unsigned int)aLength;
    {
    static NSMutableString *spaces = nil;
    static NSLock *spacesLock;
    static unsigned int spacesLength;
    
    if (!spaces) {
    spaces = [@"                " mutableCopy];
    spacesLength = [spaces length];
        spacesLock = [[NSLock alloc] init];
    }
    if (spacesLength < aLength) {
        [spacesLock lock];
        while (spacesLength < aLength) {
            [spaces appendString:spaces];
            spacesLength += spacesLength;
        }
        [spacesLock unlock];
    }
    return [spaces substringToIndex:aLength];
    }
    

    从文件中复制的代码:

    Frameworks/OmniFoundation/OpenStepExtensions.subproj/NSString-OFExtensions.m
    

    关于OpenExtensions框架 Omni Frameworks 靠近 The Omni Group .

    5 回复  |  直到 9 年前
        1
  •  164
  •   tig Charlie Martin    15 年前

    有一个方法叫做 stringByPaddingToLength:withString:startingAtIndex: :

    [@"" stringByPaddingToLength:100 withString: @"abc" startingAtIndex:0]
    

    请注意,如果你想要3个abc,那么使用9( 3 * [@"abc" length] )或者创建这样的类别:

    @interface NSString (Repeat)
    
    - (NSString *)repeatTimes:(NSUInteger)times;
    
    @end
    
    @implementation NSString (Repeat)
    
    - (NSString *)repeatTimes:(NSUInteger)times {
      return [@"" stringByPaddingToLength:times * [self length] withString:self startingAtIndex:0];
    }
    
    @end
    
        2
  •  7
  •   Mike McMaster    17 年前
    NSString *original = @"abc";
    int times = 2;
    
    // Capacity does not limit the length, it's just an initial capacity
    NSMutableString *result = [NSMutableString stringWithCapacity:[original length] * times]; 
    
    int i;
    for (i = 0; i < times; i++)
        [result appendString:original];
    
    NSLog(@"result: %@", result); // prints "abcabc"
    
        3
  •  4
  •   Lee Calloway Lee Calloway    16 年前

    为了提高性能,您可以使用以下内容进入C:

    + (NSString*)stringWithRepeatCharacter:(char)character times:(unsigned int)repetitions;
    {
        char repeatString[repetitions + 1];
        memset(repeatString, character, repetitions);
    
        // Set terminating null
        repeatString[repetitions] = 0;
    
        return [NSString stringWithCString:repeatString];
    }
    

    这可以写成NSString类的类别扩展。可能有一些检查应该放在那里,但这是它的直截了当的要点。

        4
  •  2
  •   user144851 user144851    16 年前

    上述第一种方法适用于单个字符。这是一个字符串。它也可以用于单个字符,但开销更大。

    + (NSString*)stringWithRepeatString:(char*)characters times:(unsigned int)repetitions;
    {
        unsigned int stringLength = strlen(characters);
        unsigned int repeatStringLength = stringLength * repetitions + 1;
    
        char repeatString[repeatStringLength];
    
        for (unsigned int i = 0; i < repetitions; i++) {
            unsigned int pointerPosition = i * repetitions;
            memcpy(repeatString + pointerPosition, characters, stringLength);       
        }
    
        // Set terminating null
        repeatString[repeatStringLength - 1] = 0;
    
        return [NSString stringWithCString:repeatString];
    }
    
        5
  •  1
  •   Community Mohan Dere    9 年前

    如果你在Python中使用Cocoa,那么你可以这样做,就像PyObjC所说的那样 NSString 所有的Python unicode 类的能力。

    否则,有两种方法。

    一种方法是创建一个包含相同字符串的数组 n 时间和使用 componentsJoinedByString: 。大致如下:

    NSMutableArray *repetitions = [NSMutableArray arrayWithCapacity:n];
    for (NSUInteger i = 0UL; i < n; ++i)
        [repetitions addObject:inputString];
    outputString = [repetitions componentsJoinedByString:@""];
    

    另一种方法是从空开始 NSMutableString 并将字符串附加到它上面 n 时间,就像这样:

    NSMutableString *temp = [NSMutableString stringWithCapacity:[inputString length] * n];
    for (NSUInteger i = 0UL; i < n; ++i)
        [temp appendString:inputString];
    outputString = [NSString stringWithString:temp];
    

    你可以剪下 stringWithString: 如果您可以在此处返回可变字符串,请调用。否则,您可能应该返回一个不可变字符串 stringWithString: 这里的消息表示内存中有两个字符串副本。

    因此,我建议 componentsJoinedByString: 解决方案。

    [编辑:借用想法使用 …WithCapacity: 方法从 Mike McMaster's answer .]