【问题标题】:How to count words within a text string?如何计算文本字符串中的单词?
【发布时间】:2010-02-15 14:10:41
【问题描述】:

在 iOS 上,如何计算特定文本字符串中的字数?

【问题讨论】:

    标签: ios objective-c nsstring


    【解决方案1】:

    比拆分更有效的方法是逐字符检查字符串。

    int word_count(NSString* s) {
      CFCharacterSetRef alpha = CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric);
      CFStringInlineBuffer buf;
      CFIndex len = CFStringGetLength((CFStringRef)s);
      CFStringInitInlineBuffer((CFStringRef)s, &buf, CFRangeMake(0, len));
      UniChar c;
      CFIndex i = 0;
      int word_count = 0;
      Boolean was_alpha = false, is_alpha;
      while (c = CFStringGetCharacterFromInlineBuffer(&buf, i++)) {
        is_alpha = CFCharacterSetIsCharacterMember(alpha, c);
        if (!is_alpha && was_alpha)
          ++ word_count;
        was_alpha = is_alpha;
      }
      if (is_alpha)
        ++ word_count;
      return word_count;
    }
    

    @ennuikiller's solution相比,计算一个1,000,000字的字符串需要:

    • 0.19 秒构建字符串
    • 0.39 秒构建字符串 + 使用我的方法计数。
    • 1.34 秒构建字符串 + 使用 ennukiller 方法计数。

    我的方法的最大缺点是它不是单行的。

    【讨论】:

    • 不是单行字有点轻描淡写! :) op 没有要求最有效的解决方案。我怀疑 NSString 类中的大多数方法可以更有效地编码。我想决定因素是“文本字符串”有多大。
    • 谢谢肯尼!我只是问了一个类似的问题,你的回答很好! +1 ...我会悄悄地借用你的代码。
    • 解决方案(稍微)损坏了。并非所有字符都适合一个 unichar。
    【解决方案2】:
     [[stringToCOunt componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet] count]
    

    【讨论】:

    • [[stringToCount componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet] count].
    • 再次修复。 [[stringToCOunt componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet]] count] 我正在通过搜索“计数单词”或类似的东西来查看文档,但我找不到一个好方法。这个解决方案对我来说似乎没问题。谢谢你们。 (你们真快!)
    • 这不是最有效的单词计数方式。特别是不明智的,因为它会将整个字符串拆分为一个临时数组,然后将其丢弃。最好简单地查看文本中的空白和标点符号。这不能在一行中完成,但它会更快,并且不会使用至少两倍的文本内存。
    • 不准确的解决方案,因为它不能正确处理连续的空格。
    【解决方案3】:

    我觉得这个方法比较好:

    __block int wordCount = 0;
    NSRange range = {0,self.text.length };
    [self.text enumerateSubstringsInRange:range options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        wordCount++;
    }];
    

    作为参考,请查看 WWDC 2012 的第 215 场会议的视频:Douglas Davidson 的文本和语言分析

    【讨论】:

    • 这个实现不能自定义单词的定义。
    【解决方案4】:

    一个线性精确的解决方案:

    return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;
    

    此解决方案正确处理连续空格。

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多