Как выполнить поиск в NSArray?

#iphone #objective-c #ios4 #xcode4.2

#iPhone #objective-c #ios4 #xcode4.2

Вопрос:

У меня есть массив, подобный fallowing,

 NSArray*array = [NSArray arrayWithObjects:@"1.1 something", @"1.2 something else", @"1.3 out of left field", @"1.4 yet another!", nil];
  

Теперь у меня есть строка, подобная fallowing,

 NSString*str = @"1.3";
  

Теперь я отправлю str .Затем ему нужно найти этот str в массиве и вернуть индекс объекта, в котором был найден этот текст.Означает, что мне нужен индекс 2, который должен отображаться в качестве выходных данных.Кто-нибудь может поделиться кодом, пожалуйста.Заранее спасибо.

Комментарии:

1. Я изменил ваш набор данных, чтобы точнее отразить то, что, как мне кажется, вы хотите спросить. Ваш старый набор данных сбивал людей с толку, потому что числа были единственными отличиями между строками.

Ответ №1:

Вот пример использования блоков, обратите внимание на метод: hasPrefix:

 NSArray *array = [NSArray arrayWithObjects:@"1.1 problem1", @"1.2 problem2", @"1.3 problem3", @"1.4 problem4", nil];
NSString *str = @"1.3";

NSUInteger index = [array indexOfObjectPassingTest:
                    ^(id obj, NSUInteger idx, BOOL *stop) {
                        return [obj hasPrefix:str];
                    }];

NSLog(@"index: %lu", index);
  

Вывод NSLog:

 index: 2
  

Ответ №2:

Сначала комментарий,

 NSString *str = 1.3;
  

не создает NSString объект. Вместо этого вы должны иметь

 NSString *str = @"1.3";
  

Для поиска NSArray вам придется либо изменить строку на точную строку в массиве, либо также выполнить поиск NSString . В первом случае просто выполните

 float num = 1.3;
NSString *str = [NSString stringWithFormat:@"%.1f problem%d",num,(num*10)%10];

[array indexOfObject:str];
  

Вы также можете стать более популярным, используя NSPredicate s.

Комментарии:

1. Отличный вариант. Но если я отправил completestring, ничего не имеет значения, есть прямой метод indexOfObject . Но я отправлю только 1.3 . Просто прочитайте вопрос еще раз. В любом случае, спасибо.

Ответ №3:

Попробуйте

 NSString *searchString = [str stringByAppendingFormat: @" problem%@", [str substringFromIndex: 2]];
NSUInteger index = [array indexOfObject: searchString];
  

Или (потому что вам почему-то нравятся oneliners):

 [array indexOfObject: [[array filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"SELF beginswith %@", str]] objectAtIndex: 0]];
  

Комментарии:

1. Я ничего не буду менять. у меня тот же массив и та же строка. И я отправлю только 1.3-йыыыыыыыы. тогда я хочу индекс. Я думаю, теперь вы поняли, в чем дело.

Ответ №4:

Самый простой способ — перечислить значения массива и проверить подстроки:

 NSArray *array = [NSArray arrayWithObjects: @"1.1 something", @"1.2 something else", @"1.3 out of left field", @"1.4 yet another!", nil];
NSString *str = @"1.33";
int i = -1;
int index = -1;
for (NSString *arrayString in array) {
    i  ;
    if ([arrayString rangeOfString: str].location != NSNotFound) {
        index = i;
        break;
    }
}
NSLog(@"Index: %d", index);
  

Не оптимально, но будет работать.