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

Objective c 通过将另一个字符串重复给定次数来创建NSString,objective-c,cocoa,string,Objective C,Cocoa,String,这应该很容易,但我很难找到最简单的解决方案 我需要一个NSString,它等于另一个字符串自身连接了给定次数 为了更好的解释,请考虑下面的Python示例: >> original = "abc" "abc" >> times = 2 2 >> result = original * times "abcabc" 有什么提示吗 编辑: 在从OmniFrameworks查看了这个实现之后,我打算发布一个类似于的解决方案: // returns a strin

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

我需要一个
NSString
,它等于另一个字符串自身连接了给定次数

为了更好的解释,请考虑下面的Python示例:

>> original = "abc"
"abc"
>> times = 2
2
>> result = original * times
"abcabc"
有什么提示吗


编辑:

在从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];
}
在由的OpenExtensions框架上。

NSString*original=@“abc”;
整数倍=2;
//容量不限制长度,它只是初始容量
NSMutableString*结果=[NSMutableString stringWithCapacity:[原始长度]*次];
int i;
对于(i=0;i<次;i++)
[结果追加字符串:原始];
NSLog(@“结果:%@”,结果);//打印“abcabc”

如果您在Python中使用Cocoa,那么您可以这样做,因为PyObjC将
NSString
与Python
unicode
类的所有功能结合在一起

否则,有两种方法

一种方法是创建一个数组,其中包含相同的字符串
n
次,并使用
组件jjoinedbystring:
。大概是这样的:

NSMutableArray *repetitions = [NSMutableArray arrayWithCapacity:n];
for (NSUInteger i = 0UL; i < n; ++i)
    [repetitions addObject:inputString];
outputString = [repetitions componentsJoinedByString:@""];
NSMutableString *temp = [NSMutableString stringWithCapacity:[inputString length] * n];
for (NSUInteger i = 0UL; i < n; ++i)
    [temp appendString:inputString];
outputString = [NSString stringWithString:temp];
+ (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];
}
@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
如果可以在此处返回可变字符串,则可以剪切
stringWithString:
调用。否则,您可能应该返回一个不可变字符串,这里的
stringWithString:
消息意味着您在内存中有两个字符串副本

因此,我建议使用
组件jjoinedbystring:
解决方案


[编辑:借用了使用
…with capacity:
方法的想法。]

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

NSMutableArray *repetitions = [NSMutableArray arrayWithCapacity:n];
for (NSUInteger i = 0UL; i < n; ++i)
    [repetitions addObject:inputString];
outputString = [repetitions componentsJoinedByString:@""];
NSMutableString *temp = [NSMutableString stringWithCapacity:[inputString length] * n];
for (NSUInteger i = 0UL; i < n; ++i)
    [temp appendString:inputString];
outputString = [NSString stringWithString:temp];
+ (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];
}
@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

这可以作为NSString类上的类别扩展来编写。这里可能会抛出一些检查,但这是直接的要点。

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

+ (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];
}
+(NSString*)stringWithRepeatString:(char*)字符次数:(unsigned int)重复;
{
unsigned int stringLength=strlen(字符);
无符号int repeatStringLength=stringLength*重复次数+1;
字符repeatString[repeatStringLength];
for(无符号整数i=0;i<重复;i++){
无符号整数指针位置=i*重复;
memcpy(重复字符串+指针位置、字符、字符串长度);
}
//设置终止空值
repeatString[repeatStringLength-1]=0;
返回[NSString stringWithCString:repeatString];
}

有一种方法称为
stringByPaddingToLength:withString:startingAtIndex:

[@"" stringByPaddingToLength:100 withString: @"abc" startingAtIndex:0]
请注意,如果您想要3个abc,请使用9(
3*[@“abc”长度]
)或创建如下类别:

NSMutableArray *repetitions = [NSMutableArray arrayWithCapacity:n];
for (NSUInteger i = 0UL; i < n; ++i)
    [repetitions addObject:inputString];
outputString = [repetitions componentsJoinedByString:@""];
NSMutableString *temp = [NSMutableString stringWithCapacity:[inputString length] * n];
for (NSUInteger i = 0UL; i < n; ++i)
    [temp appendString:inputString];
outputString = [NSString stringWithString:temp];
+ (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];
}
@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

我试图想出一个更简单的方法,但我认为这是最短的方法。自从被接受以来,我通过首先指定时间并使容量=[原始长度]*时间来提高效率。只是为了完整性,如果出于某种原因你想使用大数,您可以通过重用两个连接(例如,foo*10=foo*2+foo*8;foo*8=foo*4+foo*4;foo*4=foo*2+foo*2->3个concat操作而不是9)的功能来改进这一点。此解决方案的效率不如使用
stringByPaddingToLength:with-string:startinga索引:
的顶级答案。感谢您选择使用由字符串连接的组件。是的,建议不错。可能比我的(公认的通用)解决方案更有效。好主意,特别是对于性能要求高的场景。谢谢David,repetitions是一个未签名的intI,如果结果是
NSString
stringByPaddingToLength:with-string:startingAtIndex:
以相同的方式实现,我也不会感到惊讶。+1用于在对标准库的一次调用中完成所有操作。下面是我如何使用它创建一个逗号分隔的问号列表(用于馈送到SQLite)--
[@“stringByPaddingToLength:[字段计数]*2-1,带有字符串:@“,“startingAtIndex:0]
。我想,在for循环中有一个错误:
unsigned int pointerPosition=I*重复应该是
无符号int pointerPosition=i*stringLength其中i*重复变为i*stringLength。