56 votes

Créer NSString en répétant une autre chaîne un nombre de fois donné

Ce devrait être facile, mais je vais avoir un moment difficile de trouver la solution la plus simple.

J'ai besoin d'un NSString qui est égal à l'autre de la chaîne concaténée avec elle-même un certain nombre de fois.

Pour une meilleure explication, considérez les points suivants python exemple:

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

Tous les conseils?


EDIT:

J'allais poster une solution similaire à celui produit par Mike McMaster, en réponse, d'après ce mise en œuvre de la 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];
}

Code reproduit dans le fichier:

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

sur le OpenExtensions cadre de l' Omni Cadres par L'Omni Group.

160voto

tig Points 5567

Il existe une méthode appelée stringByPaddingToLength:withString:startingAtIndex: :

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

Notez que si vous voulez 3 abc, utilisez 9 ( 3 * [@"abc" length] ) ou créez une catégorie comme celle-ci:

 @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
 

7voto

Mike McMaster Points 4300
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"

1voto

Peter Hosey Points 66275

Si vous utilisez du Cacao en Python, alors vous pouvez simplement le faire, comme la PyObjC imprègne NSString avec l'ensemble de l'Python unicode de la classe capacités.

Sinon, il y a deux façons.

L'une est de créer un tableau avec la même chaîne de il n temps, et d'utiliser componentsJoinedByString:. Quelque chose comme ceci:

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

L'autre façon serait de commencer avec un vide NSMutableString et ajouter la chaîne à il n de temps, comme ceci:

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

Vous pouvez être en mesure de couper l' stringWithString: appel si elle est OK pour vous de retourner une mutable chaîne ici. Sinon, vous devriez probablement de retour immuable de la chaîne, et l' stringWithString: message ici signifie que vous avez deux copies de la chaîne de caractères en mémoire.

Je vous recommande donc de componentsJoinedByString: de la solution.

[Edit: a Emprunté l'idée d'utiliser …WithCapacity: méthodes de Mike McMaster réponse.]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X