Maison > Questions et réponses > le corps du texte
今天看到这个“Objective-C分割NSString”,有人用正则表达式进行解答,感觉很特别。所以就把以前遇到的字符串反转的问你拿出来讨论讨论,可不可以用正则表达式来解决呢?
下面是个最简单的实现的如有什么效率问题,边界问题也希望多给意见。
/**** NSString+Reverse.h ****/ #import <Foundation/Foundation.h> @interface NSString (Reverse) - (NSString *)stringByReversed; @end /**** NSString+Reverse.m ****/ #import "NSString+Reverse.h" @implementation NSString (Reverse) - (NSString *)stringByReversed { NSMutableString *s = [NSMutableString string]; for (NSUInteger i=self.length; i>0; i--) { [s appendString:[self substringWithRange:NSMakeRange(i-1, 1)]]; } return s; } @end分割线
根据@ParagonLight同学的回答我用如下代码做了个测试:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"ss.SSSS"]; NSLog(@"S %@", [dateFormatter stringFromDate:[NSDate date]]); NSString *reversed = [string stringByReversed]; NSLog(@"E %@", [dateFormatter stringFromDate:[NSDate date]]);
测试用的字符串长度为:8970
记录了10次结果,我制作了一个图表(算法1为我问题中的;算法2为@ParagonLight同学的)
只看代码的话算法2可以提高一半的效率,之所以花的时间比算法1高出许多,是因为每次循环都会生成一个新string对象,所耗费时间确实超乎我的预想了。
分割线由于算法1和算法3相差很小,为了让结果更明显,修改了测试用例,将测试字符串长度放大100倍,现在测试字符串长度为:897000
@ParagonLight同学的算法3的性能提升还是很明显的
PHP中文网2017-04-21 11:19:12
J'ai utilisé la méthode stringByReplacingCharactersInRange: ici. Mais cette méthode crée en fait une nouvelle chaîne, elle ne semble donc pas être l'approche la plus efficace. En fait, vous pouvez convertir la chaîne en un tableau de caractères, puis définir deux pointeurs pour pointer vers la tête et la queue du tableau, puis échanger les valeurs pointées dans l'ordre jusqu'à ce que i>j.
Je n'ai pas été en contact avec iOS depuis longtemps et je ne connais pas grand-chose à ses fonctionnalités. Veuillez signaler s'il y a des erreurs.
- (NSString *)stringByReversed { NSUInteger i = 0; NSUInteger j = self.length - 1; NSString *temp; NSString *newString = self; NSLog(@"%@", self); while (i < j) { temp = [newString substringWithRange:NSMakeRange(i, 1)]; newString = [newString stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:[self substringWithRange:NSMakeRange(j, 1)]]; newString = [newString stringByReplacingCharactersInRange:NSMakeRange(j, 1) withString:temp]; NSLog(@"%@",newString); i ++; j --; } NSLog(@"%@", newString); return newString; }Ligne de séparation
Essayez celle-ci
-(NSString *)stringByReversed{ NSUInteger i = 0; NSUInteger j = self.length - 1; unichar characters[self.length]; while (i < j) { characters[j] = [self characterAtIndex:i]; characters[i] = [self characterAtIndex:j]; i ++; j --; } if(i == j) characters[i] = [self characterAtIndex:i]; return [NSString stringWithCharacters:characters length:self.length]; }Mise à jour : Algorithme 4
L'inspection visuelle indique que le tableau unichar est hors limites. Juste malloc directement. . . Mais je dois dire que ce n'est plus OC. . .
- (NSString *)stringByReversed{ uint64_t i = 0; uint64_t j = self.length - 1; // unichar characters[self.length]; unichar *characters = malloc(sizeof([self characterAtIndex:0]) * self.length); while (i < j) { characters[j] = [self characterAtIndex:i]; characters[i] = [self characterAtIndex:j]; i ++; j --; } if(i == j) characters[i] = [self characterAtIndex:i]; return [NSString stringWithCharacters:characters length:self.length]; }