1

I'm having some trouble with a string represented as an array of characters. What I'd like to do, as I would do in java, is the following:

     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++;
    }

What I'm doing is something like this:

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++;
}

I'm not sure how I'm supposed to convert

 String token = buffer.toString();

to objective c, where buffer is an NSMutableString. Also, how do I check this if condition in objective c?

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

WORD_CHARS is an NSString. I'm also having trouble with appending ch to buffer.

Any help is greatly appreciated.

4

2 回答 2

6

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

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

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

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

于 2013-06-30T11:23:12.543 回答
1

从您的示例看来,您正在尝试省略标点符号并从给定字符串创建单词列表。如果这是您的意图,那么基金会会为您提供保障。如果这不是您的意图,请随意减一。

假设您的原始字符串存储在名为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:.

于 2013-06-30T22:18:23.837 回答