今天看到这个“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
여기서는 stringByReplacingCharactersInRange: 메소드를 사용했습니다. 하지만 이 방법은 실제로 새로운 문자열을 생성하기 때문에 가장 효율적인 접근 방식이라고 느껴지지 않습니다. 실제로 문자열을 char 배열로 변환한 다음 배열의 헤드와 테일을 가리키도록 두 개의 포인터를 설정한 다음 i>j가 될 때까지 순차적으로 지정된 값을 교환할 수 있습니다.
iOS를 오랫동안 접해본 적이 없어서 기능에 대해 잘 모릅니다. 잘못된 점이 있으면 지적해 주세요.
이것을 사용해 보세요
으아아아 업데이트: 알고리즘 4육안 검사 결과 unichar 배열이 범위를 벗어났습니다. 그냥 직접 malloc하세요. . . 하지만 이건 더 이상 OC가 아닙니다. . .
으아아아