Подтвердить что ты не робот

Создайте NSString, повторив другую строку определенное количество раз

Это должно быть легко, но мне трудно найти самое легкое решение.

Мне нужен NSString, который равен другой строке, объединенной с самим собой определенное количество раз.

Для лучшего объяснения рассмотрим следующий пример python:

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

Любые подсказки?


EDIT:

Я собирался опубликовать решение, аналогичное решению Майка МакМастера, после просмотра этой реализации из 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 Группа.

4b9b3361

Ответ 1

Существует метод под названием 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

NSString *original = @"abc";
int times = 2;

// Capacity does not limit the length, it 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

Для производительности вы можете перейти на 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

Первый метод выше для одного символа. Это для строки символов. Он также может использоваться для одного символа, но имеет больше накладных расходов.

+ (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

Если вы используете Cocoa в Python, вы можете просто сделать это, так как 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:.

[Edit: заимствованная идея использовать методы …WithCapacity: из ответ Майка Макмастера.]