1

比较两个 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

什么时候应该 OK OK NO

编辑 2

对不起,如果我表达错误。

当我写 2 个匹配的单词时,我想要的结果是“OK OK NO”,或者可能是返回匹配数的结果。所以在前面的例子中:

级别:“一二三” 文本:“一二” 结果:“2 个匹配词”

4

3 回答 3

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
于 2013-10-03T14:22:28.090 回答
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");
    }
}
于 2013-10-03T13:57:27.797 回答
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");
        }
于 2013-10-03T13:55:19.773 回答