2012-05-10 3 views
0

Okey. У меня есть массив с именами песен. У меня также есть база данных CoreData с некоторыми из тех же самых песен. Как эффективно проверить, какие песни есть в обоих? Я действительно не хочу сравнивать каждую песню в базе данных со всеми элементами массива, используя цикл for. Мне также нужно знать номера элементов в массиве songnames, который находится в массиве CD. Может кто-нибудь мне помочь? Благодаря!Эффективно сравнивать элементы в массиве с строками строк coredata

+0

Что плохого в отношении петли? – peko

+0

@peko Затем мне нужно сравнить каждую строку данных ядра со всем массивом. Это не хорошее программирование. –

+0

Да, но микро-оптимизация - это .. – peko

ответ

5

Вы можете добавить два массива в два разных набора, а затем найти пересечение. Это даст вам общий объект (имена песен в вашем случае) в обоих наборах.

Пример:

NSSet *set1 = [[NSSet alloc] initWithObjects:@"one",@"two", nil]; 
NSSet *set2 = [[NSSet alloc] initWithObjects:@"one",@"none", nil]; 
NSMutableSet *set3 = [[NSMutableSet alloc] initWithSet:set1]; 
[set3 intersectSet:set2]; 

В вашем случае вы можете использовать метод initWithArray.

+0

Есть ли способ изменить это, чтобы я мог получить элемент nr в первом массиве (большем массиве) соответствующих элементов? –

+0

Мне это удалось немного по-другому. –

+0

@Alex - для вашего первого комментария: да, вы можете это сделать, вызов метода пересекается в set1 для set2. пример: [set1 intersectSet set2]; просто не забудьте выделить set1 как NSMutableSet в этом случае – zahreelay

2

Если ваш массив имен песен является стандартным NSArray, у вас нет выбора, кроме как выполнить операцию линейного поиска (т. Е. Цикл for). Если вы используете другую структуру данных (например, отсортированный массив), вы можете немного сократить выполнение, выполнив двоичный поиск пополам вместо линейного поиска, чтобы найти совпадения.

0

В конце концов я решил это, используя перекресток. Zahreelay указал мне в правильном направлении, но мне нужно было сделать что-то другое с кодом, чем то, что он сделал. Если кто-то еще может выиграть от этого решения в будущем, я решил опубликовать его.

NSMutableArray *playlist = [[NSMutableArray alloc] initWithObjects:@"Walk", @"The Pretender", @"Best Of You", @"Everlong",nil]; 

NSMutableArray *coredataArray =[[NSMutableArray alloc] initWithObjects:@"Walk", @"Everlong",nil]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

int tracknum = 0; 

for (id obj in spilleliste) { 

    if ([stemmeliste containsObject:obj]) { 

     NSNumber *tracknumber = [NSNumber numberWithInt:tracknum]; 

     [array addObject:tracknumber]; 

    } 
    tracknum++; 
} 

NSLog(@"Array: %@",array); 

Выход:

2012-05-11 01:08:20.154 compare[19936:207] Array : (
    0, 
    3 
) 
1

NSArray документация имеет разделы по Querying an Array и Finding Objects in an Array. Просто используйте комбинацию containsObject: и 'indexOfObject: Вам все равно придется перебирать песни, возвращенные из вашей базы данных.

NSArray *fetchResults = [NSArray arrayWithObjects:@"Song1", @"Song2", @"Song3", nil];  

for(id song in myArray) { 
    if([fetchResults containsObject:song]) { 
     int index = [fetchResults indexOfObject:song]; 
     // do something with value 
    } 
} 
Смежные вопросы