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
与Pythonunicode
类的所有功能结合在一起
否则,有两种方法
一种方法是创建一个数组,其中包含相同的字符串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。