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

今天看到这个“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的性能提升还是很明显的

巴扎黑
巴扎黑

membalas semua(1)
洪涛

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.
Saya sudah lama tidak berhubung dengan iOS, dan saya tidak tahu banyak tentang ciri-cirinya. Sila nyatakan jika terdapat apa-apa yang salah.

- (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;
}
Barisan pemisah

Cuba yang ini

-(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];
}
Kemas kini: Algoritma 4

Pemeriksaan visual menunjukkan bahawa tatasusunan unichar berada di luar batas. Hanya malloc secara langsung. . . Tetapi saya perlu katakan, ini bukan lagi 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];
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan