【问题标题】:How can I optimize this loop?如何优化这个循环?
【发布时间】:2011-05-30 18:01:15
【问题描述】:

我有一段代码返回一个表示“搜索结果”的超长字符串。每个结果都由一个双 HTML 中断符号表示。例如:

结果 1

结果 2

结果 3

我有以下循环,它获取每个结果并将其放入一个数组中,去除中断指示符“kBreakIndicator”(

)。问题是这个lopp执行时间太长了。有几个结果很好,但是一旦你达到一百个结果,它会慢 20-30 秒。这是不可接受的表现。我可以做些什么来提高性能?

这是我的代码:

content 是原始的 NSString。

  NSMutableArray *results = [[NSMutableArray alloc] init];

  //Loop through the string of results and take each result and put it into an array
   while(![content isEqualToString:@""]){
   NSRange rangeOfResult = [content rangeOfString:kBreakIndicator];
   NSString *temp = (rangeOfResult.location != NSNotFound) ? [content substringToIndex:rangeOfResult.location] : nil; 
   if (temp) {
    [results addObject:temp];
    content = [[[content stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@%@", temp, kBreakIndicator] withString:@""] mutableCopy] autorelease];
   }else{
    [results addObject:[content description]];
    content = [[@"" mutableCopy] autorelease];
   }
  }
//Do something with the results array.
[results release];

【问题讨论】:

    标签: iphone objective-c c optimization loops


    【解决方案1】:

    你可以做的是首先使用NSStringcomponentsSeparatedByString:方法,它会给你一个NSArray,像这样:

    编辑:假设您的 kBreakIndicator 常量是 <br>

    NSArray *temp_results = [content componentsSeparatedByString:kBreakIndicator];
    NSMutableArray *results = [[NSMutableArray alloc] init];
    for(NSString *result in temp_results) {
       if(result.length == 0) continue;
       [results addObject:result];
    }
    //do something with results...
    [results release];
    

    @invariant 的回答结果http://cl.ly/3Z112M3z3K1V2t0A3N2L

    我的回答结果http://cl.ly/371b2j2H0Y1E110D2w0I

    如果您的kBreakIndicator 常量是<br><br>

    NSArray *result = [content componentsSeparatedByString:kBreakIndicator];
    

    【讨论】:

    • results 一开始什么都没有。由于result 的长度始终为0,因此循环将无限期地继续。
    • 哈! @JacobRelkin 再次救援。在我接受它之前我需要测试它,当然,但这听起来像我正在寻找的东西。我们应该取得联系。我有兴趣了解更多关于您提供的课程的信息。 (我的联系信息在我的简历中,在我的网站上。MosheBerman.com)
    • @Aleksander 我忘了替换它来遍历temp_results
    • @Jacob I dont see the need to introduce the filtering for empty strings. The original code dosn't do it, so componentsSeparatedByString` 就足够了。
    • @JacobRelkin - 我似乎不需要 for 循环,但 componentsSeparatedByString:kBreakIndicator 代码可以解决问题。我的循环就是试图做到这一点。
    【解决方案2】:

    应该这样做:

    NSArray *results = [content componentsSeparatedByString:@"<br><br>"];
    

    【讨论】:

    • componentsSeparatedByString: 将为此返回空字符串。
    • 我已经编辑澄清分隔符字符串是&lt;br&gt;&lt;br&gt;,所以没有空字符串。
    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 2014-09-07
    • 2011-12-08
    • 2021-02-26
    • 2020-03-12
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多