在两个字符串中查找匹配单词的序列

时间:2013-10-03 13:46:08

标签: objective-c string cocos2d-iphone compare

比较两个NSString数组时遇到问题。 其中一个数组不断变化,因为它链接到UITextField,所以当你写任何东西时,它都存储在数组中。

-(void) tick: (ccTime) dt{


NSString *level = (NSString *)gameData[2]; //this doesn't change. example: "one two three .."

NSString *text = (NSString *)tf.text; //text field keeps changing as I write

NSArray *separatedText = [text componentsSeparatedByString:@" "];
NSArray *separatedLevel = [level componentsSeparatedByString:@" "];

我想检查您正在编写的任何单词是否与存储在关卡数组中的任何单词匹配。 例如, 等级是:“比较两个字符串” 我写“比较” 所以这个方法会返回1个单词匹配。因此,如果我写“比较两个”,则返回2个单词匹配。

我尝试使用此代码:

for (int i=0;i<separatedText.count;i++){
    for (int j=0;j<separatedLevel.count;j++){
        if (![separatedText[i] caseInsensitiveCompare:separatedLevel[j]]){
            NSLog(@"OK");

            }

        }else{
            NSLog(@"NO");
        }


    }

}

但它无法正常工作。 有什么想法吗?

非常感谢。

修改

caseInsensitiveCompare不返回BOOL,但它对我有用。 如果我使用“一二三”级别和文本“一”运行此代码,结果为:

OK
NO
NO

对于“一二”,结果是:

NO
OK
NO

什么时候应该没问题

编辑2

很抱歉,如果我表达自己错了。

当我写两个匹配的单词时,我想要的结果是“OK OK NO” 或者,也许是返回匹配数的结果。 所以使用前面的例子:

等级:“一二三” 文字:“一二” 结果:“2个匹配的单词”

3 个答案:

答案 0 :(得分:1)

使用快速枚举器尝试这样: -

NSArray *separatedText=[NSArray arrayWithObjects:@"one",@"two",@"three",nil];
NSArray *separatedLevel=[NSArray arrayWithObjects:@"one",@"two",nil];
NSString *str1;
NSString *str2;
BOOL isMatch;

for (str1 in separatedText){
    isMatch=NO;
    for (str2 in separatedLevel){
        if (![str1 caseInsensitiveCompare:str2])
        {
            NSLog(@"OK");
            isMatch=YES;
        }
    }
    if (isMatch==NO)
    {
        NSLog(@"NO");
    }
}

答案 1 :(得分:1)

问题是,如果找到匹配项,则需要增加i,并记下您所做的连续匹配的计​​数。

我已经在这里将它实现为C函数,但是将它转换为Objective-C类方法应该没有问题

#import <Foundation/Foundation.h>

NSUInteger numSequentialMatches(NSString *s1, NSString *s2) {
    NSUInteger sequence = 0, highestSequence = 0;
    NSArray *a1 = [s1 componentsSeparatedByString:@" "];
    NSArray *a2 = [s2 componentsSeparatedByString:@" "];
    for (NSInteger i = 0; i < a1.count; i++) {
        for (NSInteger j = 0; j < a2.count; j++) {
            if ([a1[i] caseInsensitiveCompare:a2[j]] == NSOrderedSame) {
                if (i < a1.count)
                    i++;
                if (++sequence > highestSequence)
                    highestSequence = sequence;
            } else {
                sequence = 0;
            }
        }
    }
    return highestSequence;
}

int main(int argc, const char **argv) {
    @autoreleasepool {
        NSLog(@"%lu", numSequentialMatches(@"one two three", @"one"));
        NSLog(@"%lu", numSequentialMatches(@"one two three", @"one two"));
    }
    return 0;
}

$ clang -o array array.m -framework Foundation
$ ./array
2013-10-03 15:21:08.166 array[17194:707] 1
2013-10-03 15:21:08.167 array[17194:707] 2

答案 2 :(得分:0)

改为使用NSPredicates

 NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"SELF contains '%@'",separatedText];

        NSArray *filteredArray  = [separatedLevel filteredArrayUsingPredicate:predicate ];
        if ([filteredArray count] == 0){
            NSLog(@"No elements");
        }
        else{
            NSLog(@"Have elements");
        }