objective-c - 关于NSString字符串反转的问题
巴扎黑
巴扎黑 2017-04-21 11:17:12
0
1
689

今天看到这个“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
分割线

3月24日补充

根据@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对象,所耗费时间确实超乎我的预想了。

分割线

3月25日补充

由于算法1和算法3相差很小,为了让结果更明显,修改了测试用例,将测试字符串长度放大100倍,现在测试字符串长度为:897000

@ParagonLight同学的算法3的性能提升还是很明显的

巴扎黑
巴扎黑

全員に返信(1)
洪涛

ここでは stringByReplacingCharactersInRange: メソッドを使用しました。ただし、この方法は実際には新しい文字列を作成するため、最も効率的なアプローチとは思えません。実際、文字列を char 配列に変換し、配列の先頭と末尾を指すように 2 つのポインターを設定し、i>j になるまでポイントされた値を順番に交換することができます。
iOSにあまり触れていないので、機能についてはよくわかっていませんが、間違いがあればご指摘ください。

リーリー 区切り線

これを試してください

リーリー 更新: アルゴリズム 4

目視検査により、unichar 配列が範囲外であることが示されました。直接mallocするだけです。 。 。しかし、これはもう OC ではないと言わざるを得ません。 。 。

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート