2013-10-03 4 views
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"); 
     } 


    } 

} 

, но он не работает должным образом. Любые идеи?

спасибо.

EDIT

caseInsensitiveCompare не возвращает BOOL, но это работает для меня так. Если я запускаю этот код с уровня «один два три» и текст «один» результат:

OK 
NO 
NO 

И «один два» Результат:

NO 
OK 
NO 

Когда это должно быть OK OK НЕТ

EDIT 2

Извините, если я выразил себя неправильно.

Результат, который я хочу, «ОК ОК НЕТ», когда я пишу 2 слова, которые соответствуют Или, может быть, результат, который возвращает количество совпадений. Так и в предыдущем примере:

Уровень: «один два три» текста: «один два» Результат: «2 согласующего слово»

ответ

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 
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"); 
     } 
+0

не работает, результат всегда «ни один из элементов» – mursang

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"); 
    } 
} 
+0

рабочих но с тем же результатом, что и мой код.См. Мое редактирование. – mursang

+0

. Посмотрите, какой код правильный, но как его работа заключается в том, что он сначала пересекает всю секунду для элемента цикла с 1 элементом первого цикла for, как будто он перемещается. Таким образом, выход идет по мере редактирования. –

+0

Я изменил еще какой-нибудь код. Пожалуйста, следуйте –

Смежные вопросы