【问题标题】:Working with a string as an array of characters将字符串用作字符数组
【发布时间】:2013-06-30 11:09:14
【问题描述】:

我在将字符串表示为字符数组时遇到了一些问题。就像我在 java 中所做的那样,我想做的是:

     while (i < chars.length) {
        char ch = chars[i];
        if ((WORD_CHARS.indexOf(ch) >= 0) == punctuation) {

            String token = buffer.toString();
            if (token.length() > 0) {
                parts.add(token);
            }
            buffer = new StringBuffer();

        }
        buffer.append(ch);
        i++;
    }

我正在做的是这样的:

while(i < strlen(chars)) {

    char ch = chars[i];
    if(([WORD_CHARS rangeOfString:ch] >= 0) == punctuation) {

        NSString *token = buffer.toString();
        if([token length] > 0) {
            [parts addObject:token];
        }
        buffer = [NSMutableString string];
    }
    [buffer append(ch)];
    i++;
}

我不确定我应该如何转换

 String token = buffer.toString();

到目标 c,其中 buffer 是一个 NSMutableString。另外,如何检查目标 c 中的 if 条件?

if ((WORD_CHARS.indexOf(ch) >= 0) == punctuation) 

WORD_CHARS 是一个 NSString。我也无法将 ch 附加到缓冲区。

非常感谢任何帮助。

【问题讨论】:

  • 即使您的 Java 代码几乎可以逐字翻译为 Objective-C,也可能有更好、更简单的方法可用于实现结果。因此,如果您显示一些示例输入和预期输出会有所帮助。
  • 还有,这个问题与Java无关,请去掉标签。
  • 我认为 Java 代码 sn-p 和 Objective-C 的比较并没有错。

标签: objective-c


【解决方案1】:

有时逐行翻译并不是最好的方法。

如果charsNSString,我会做一些更类似于这个(未经测试的)代码的事情;

NSCharacterSet *punctuation = 
    [NSCharacterSet characterSetWithCharactersInString:@"<your separators>"];
NSArray *parts = [chars componentsSeparatedByCharactersInSet:punctuation];

这应该留下 parts 一个 NSString 的 NSArray,其中包含按标点符号分割的原始 NSString。

【讨论】:

    【解决方案2】:

    从您的示例看来,您正在尝试省略标点符号并从给定字符串创建单词列表。好吧Foundation 如果这是您的意图,您是否已经涵盖了。如果这不是您的意图,请随意减一。

    假设您的原始字符串存储在名为string 的变量中。这是枚举字符串中所有单词的一种方法,它会自动跳过标点符号。

    NSRange fullRange = NSMakeRange(0, string.length);
    [string enumerateSubstringsInRange:fullRange
                               options:NSStringEnumerationByWords 
                           usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        // this block will be invoked for each word in the string
        // and the word is stored in substring.
    }];
    

    鉴于这句话:

    通常,多词名称将作为多个标记返回,遵循标记器的标准标记化做法。如果设置了此选项,则多个单词的名称将连接在一起并作为单个标记返回。

    我得到的标记是(注意没有标点符号):

    通常 多 单词 名字 将要 是 回来 作为 多 代币 下列的 这 标准 标记化 实践 的 这 标记器 如果 这 选项 是 放 然后 多 单词 名字 将要 是 加入 一起 和 回来 作为 一种 单身的 令牌

    如果你有更复杂的需求,可以使用enumerateLinguisticTagsInRange:scheme:options:orthography:usingBlock:查看枚举。

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 2015-01-19
      • 2011-05-02
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2016-04-01
      相关资源
      最近更新 更多