今天看到这个“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的性能提升还是很明显的
Saya menggunakan kaedah stringByReplacingCharactersInRange: di sini. Tetapi kaedah ini sebenarnya mencipta rentetan baharu, jadi ia tidak terasa seperti pendekatan yang paling berkesan. Malah, anda boleh menukar rentetan itu kepada tatasusunan aksara, kemudian tetapkan dua penuding untuk menghala ke kepala dan ekor tatasusunan, dan kemudian menukar nilai runcing dalam urutan sehingga i>j.
Barisan pemisahSaya sudah lama tidak berhubung dengan iOS, dan saya tidak tahu banyak tentang ciri-cirinya. Sila nyatakan jika terdapat apa-apa yang salah.
Cuba yang ini
Kemas kini: Algoritma 4Pemeriksaan visual menunjukkan bahawa tatasusunan unichar berada di luar batas. Hanya malloc secara langsung. . . Tetapi saya perlu katakan, ini bukan lagi OC. . .