2013-12-17 5 views
1

Я пытаюсь выполнить сравнение строк в двух строках, хранящихся в двух разных массивах. 90% времени он работает, но в других 10% случаев это не так. В этом случае я сравниваю названия городов.isEqualToString не сравнивается правильно

Ниже мой код:

//setup of string comparison 
NSString* string1 = [information from array 1]; 
NSString *string2 = [information from array 2]; 

//remove whitespace. 
    NSArray* string1sep = [string1 componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceCharacterSet]]; 
    NSString* string1rw = [string1sep componentsJoinedByString:@""]; 
    string1rw = [string1rw lowercaseString]; 

    NSArray* string2sep = [string2 componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceCharacterSet]]; 
    NSString* string2rw = [string2sep componentsJoinedByString:@""]; 
    string2rw = [string2rw lowercaseString]; 

//compare strings 
    NSLog(@"%@ (%u): %@ (%u)", string1rw, [string1rw length], string2rw, [string2rw length]); 
    if([string1rw isEqualToString:string2rw]){ 
       NSLog(@"Success"); 
     } 

мой код обернут в цикле, который проверяет каждый элемент массива. результат выглядит так

    ----------------------- 
       Identifier 1 
       whangarei (9): whangarei (9) 
       whangarei (9): kaitaia (7) 
       whangarei (9): kerikeri (8) 
       whangarei (9): paruabay (8) 
       whangarei (9): kamo (4) 
       whangarei (9): tutukaka (8) 
       whangarei (9): auckland (8) 
       whangarei (9): kaiparacoast (12) 
       whangarei (9): paihia (6) 
       whangarei (9): hikurangi (9) 
       whangarei (9): hokianga (8) 
       whangarei (9): tba (3) 
       failure 
       ----------------------- 
       Identifier 2 
       kaiparacoast (12): whangarei (9) 
       kaiparacoast (12): kaitaia (7) 
       kaiparacoast (12): kerikeri (8) 
       kaiparacoast (12): paruabay (8) 
       kaiparacoast (12): kamo (4) 
       kaiparacoast (12): tutukaka (8) 
       kaiparacoast (12): auckland (8) 
       kaiparacoast (12): kaiparacoast (12) 
       Success 

Струны и такой же длины, как пишется то же самое, как де-капитализированы, оба имеют белое пространство удалены. почему это работает с одной строкой, но не с другой?

Для народов ссылки это мой оригинальный неочищенные код (немного сложнее читать)

- (BOOL) addToFilteredResults: (int) ofset{ 
    int catCount = 0; 
    int citCount = 0; 
    NSLog(@"-----------------------"); 
    NSLog(@"%@", [[CHARTeventsFull objectAtIndex:ofset]objectForKey:@"event"]); 
    for(NSString *cityCheck in eventCities){ 
     if([[citySelected objectAtIndex:citCount] isEqual:[NSNumber numberWithBool:YES]]){ 

      //setup of string comparison 
      NSArray* cityChecksep = [cityCheck componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceCharacterSet]]; 
      NSString* cityCheckrw = [cityChecksep componentsJoinedByString:@""]; 
      cityCheckrw = [cityCheckrw lowercaseString]; 

      NSString *city = [[CHARTeventsFull objectAtIndex:ofset]objectForKey:@"town"]; 
      NSArray* citysep = [city componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceCharacterSet]]; 
      NSString* cityrw = [citysep componentsJoinedByString:@""]; 
      cityrw = [cityrw lowercaseString]; 


      //comparison 
      NSLog(@"%@ (%u): %@ (%u)", cityrw, [cityrw length], cityCheckrw, [cityCheckrw length]); 
      if([cityCheckrw isEqualToString:cityrw]){ 


       //doing another comparison here this code can be ignored for this question 
       //---------------------------- 
       for(NSString *categoryCheck in eventCatagories){ 
         if([[catagorySelected objectAtIndex:catCount] isEqual:[NSNumber numberWithBool:YES]]){ 
          NSArray *categoriesFromEvent = [[CHARTeventsFull objectAtIndex:ofset]objectForKey:@"categories"]; 
          for (NSString *category in categoriesFromEvent) { 
           NSLog(@"%@ : %@", category, categoryCheck); 
           if([categoryCheck isEqualToString:category]){ 
            NSLog(@"Success"); 
            return YES; 
           } 
          } 
         } 
        catCount++; 
        } 
        //--------------------------- 


       } 
     } 
     citCount++; 
    } 
    NSLog(@"failure"); 
    return NO; 
} 
+0

Я не знаю, если это опечатка или ошибка копирования/вставки o r, но ваша первая строка 'NSLog()' повторяет использование «sting» (no 'r') вместо «string». Как показано, вы регистрируете что-то другое, чем вы сравниваете. –

+0

: P заменил все имена более легкими для чтения именами и очистил код всех не существенных вещей к этому вопросу. должно быть, пропустили письмо при этом. журнал правильный в моей программе. плохое исправление, которое теперь отображается в показанном коде. –

+0

также внесет поправки с моим оригинальным неочищенным кодом, а также –

ответ

0

Вы проверяете, если cityCheckrw равно cityrw, но не печатать «успех», если он не делает это через ваш вторая проверка (та, которую вы говорите, мы можем игнорировать). Кажется гораздо более вероятным, что проблема находится во второй проверке или во втором for-loop, чем две одинаковые строки не оцениваются как равные. Неужели он все еще не печатает «успех», когда вы перемещаете NSLog в соответствии с проверкой cityCheckrw/cityrw?

+0

я убрал все, и он все еще не работал. Я изменил оператор сравнения, и он сработал. Теперь я использую NSPredicate. работает угощение. –

0

Я разобрался с проблемой. Я отказался от использования 'isEqualToString' и теперь использую предикаты. не знаю, почему «isEqualToString» не работает в 100% случаев, но в основном использует ту же структуру с предикатами, и она отлично работает. Вот очищен версия того, что я сделал с предикатами для тех, кто имеет такую ​​же проблему

1 ярус решение

это

arrayOfObjects    which never changes 
filteredArrayOfObjects  which changes when filtered 
filterArray1    which has the filters stored in it 
filterArray1Selected  which has a BOOL indicating if the filter is active 

и код

//remove all objects from the filter array 
[filteredArrayOfObjects removeAllObjects]; 

//set up compounder 
NSMutableArray *compounder = [[NSMutableArray alloc] init]; 
int count = 0; 

//go though the filter array and compound all the filters that are active 
for(NSString *Check in FilterArray1){ 
    if([[filterArray1Selected objectAtIndex:count] isEqual:[NSNumber numberWithBool:YES]]){ 
     [compounder addObject:[NSPredicate predicateWithFormat:@"(filterName == %@)", Check]]; 
    } 
    count++; 
} 

//compound the filters 
NSPredicate *compounded = [NSCompoundPredicate orPredicateWithSubpredicates:compounder]; 

//filter the array 
NSMutableArray *filteredArrayOfObjects = [[NSMutableArray alloc] initWithArray: [ArrayOfObjects filteredArrayUsingPredicate:compounded]]; 

есть 2 уровня тоже, но он становится беспорядочным

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