2013-08-21 127 views
1

我想从另一个滤镜阵列阵列下面是我的代码片段字符串长度关系

NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithCapacity:1]; 
    [wordsArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    { 
     NSString *currentWord = (NSString *)obj; 
     if(([currentWord length]>=4 && [currentWord length]<=6) && [currentWord rangeOfString:@" "].location == NSNotFound) 
     { 
      [filteredArray addObject:currentWord]; 
     } 
    }]; 

我的代码是完全可以作为我的预期。我觉得使用filteredArrayUsingPredicate:是比我的代码更优化的解决方案。任何人都可以让我知道如何为我的代码编写NSPredicate。我跟很多的问题,但这个问题非是给我准确的答案来代替[currentWord长度]> = 4 & & [currentWord长度] < = 6)& & [currentWord rangeOfString:@”“] .location == NSNotFound与NSPredicate。

请提前告诉我最佳解决方案。

回答

4

尝试像谓词:

NSPredicate *p = [NSPredicate predicateWithFormat:@"length >= 4 AND length <= 6 AND NOT SELF CONTAINS ' '"]; 
+0

感谢北斗星,这是完美的工作。你能否建议我参考一下学习谓词相关的东西。 – ajay

+0

Apple指南是https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/predicates.html#//apple_ref/doc/uid/TP40001798-SW1 – Wain

2

随着谓词的一个清晰的解决方案。但它不是更快(你说优化)。即使你重复使用谓词!

我为我的2GHz i7 MacBook Pro写了一个小测试。解决办法:
1.000.000次滤波的阵列:

  • 每当一个新的谓词:39.694秒
  • 重用谓词:17.784秒
  • 您的代码:2.174秒

很大的区别不是吗?

这里是我的测试代码:

@implementation Test 
- (void)test1 
{ 
    int x = 0; 
    NSArray *array = @[@"a", @"bb", @"ccc", @"dddd", @"eeeee", @"ffffff", @"ggggggg", @"hh hh", @"ii ii"]; 
    for (int i = 0; i < 1000000; i++) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length >= 4 AND length <= 6 AND NOT self CONTAINS ' '"]; 
     x += [array filteredArrayUsingPredicate:predicate].count; 
    } 
    NSLog(@"%d", x); 
} 

- (void)test2 
{ 
    int x = 0; 
    NSArray *array = @[@"a", @"bb", @"ccc", @"dddd", @"eeeee", @"ffffff", @"ggggggg", @"hh hh", @"ii ii"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length >= 4 AND length <= 6 AND NOT self CONTAINS ' '"]; 
    for (int i = 0; i < 1000000; i++) { 
     x += [array filteredArrayUsingPredicate:predicate].count; 
    } 
    NSLog(@"%d", x); 
} 

- (void)test3 
{ 
    int x = 0; 
    NSArray *array = @[@"a", @"bb", @"ccc", @"dddd", @"eeeee", @"ffffff", @"ggggggg", @"hh hh", @"ii ii"]; 
    for (int i = 0; i < 1000000; i++) { 
     NSMutableArray *filteredArray = [NSMutableArray array]; 
     [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
     { 
      NSString *currentWord = (NSString *)obj; 
      if(([currentWord length]>=4 && [currentWord length]<=6) && [currentWord rangeOfString:@" "].location == NSNotFound) 
      { 
       [filteredArray addObject:currentWord]; 
      } 
     }]; 
     x += filteredArray.count; 
    } 
    NSLog(@"%d", x); 
} 
+0

它如何处理大量数据只能枚举一次?另外,它将如何执行相对于predicateWithBlock:? –

+0

使用长度介于0和9个字母之间的10.000个随机字符串进行测试。每次测试重复10.000次。每次创建谓词:165.828秒,重复使用谓词:167.147秒,enumerateObjectsUsingBlock:20.235秒,filteredArrayUsingPredicate:23.974秒 – Obenland

+0

@Xean我欣赏你的新思路让我试试... – ajay