2013-02-19 6 views
2

Я знаю, как объединить два массива, которые содержат некоторый дубликат: Вот Exemple, чтобы проиллюстрировать то, что я хочу сделать:Как объединить два NSArray

// Here is some dictionary which contain an unique "id" key. 
NSDictionary *dico1 = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"11111111", @"id", nil]; 
NSDictionary *dico2 = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"22222222", @"id", nil]; 
NSDictionary *dico3 = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"33333333", @"id", nil]; 
NSDictionary *dico4 = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"44444444", @"id", nil]; 
NSDictionary *dico5 = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"55555555", @"id", nil]; 

// And here is duplicates of the 2nd and 3td dictionary. 
NSDictionary *dico2_bis = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"22222222", @"id", nil]; 
NSDictionary *dico3_bis = [NSDictionary dictionaryWithObjectsAndKeys: 
          @"33333333", @"id", nil]; 

И теперь у меня есть массив, который содержит некоторые из этих словарей:

NSArray *currentArray = [NSArray arrayWithObjects: 
         dico1, dico2, dico3, nil]; 

а вот новый массив, который будет объединен с первым, который содержит некоторые дубликаты и новые «данные»:

NSArray *tempArray = [NSArray arrayWithObjects: 
         dico2_bis, dico3_bis, dico4, dico5, nil]; 

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

NSArray *finalArray = [NSArray arrayWithObjects: 
         dico1, dico2, dico3, dico4, dico5, nil]; 


Я не знаю, как то, что является наиболее эффективным решением, слияние действительно есть Быть быстрым. Должен ли я выполнять быстрый алгоритм перечисления или блочный алгоритм перечисления или, возможно, реализацию NSPredicate? Я уже искал NSPredicate, но не нашел способ фильтрации массива с другим массивом =/
Любая помощь была бы оценена.

+2

Что такое «дублон»? – trojanfoe

+0

@trojanfoe жаль об этом слове (google translate, я вас ненавижу!) D) Я бы имел в виду, как сказал Торстен С., дубликат. Прошу прощения за путаницу. Мой вопрос был отредактирован. – klefevre

+0

@ kl94: У словарей есть другие ключи помимо «id»? Что должно произойти, если у вас есть 2 словаря с одинаковым идентификатором, но разные другие ключи/значения? –

ответ

3

Вы не используете NSArrays, вам нужен набор, который автоматически устраняет «дубликаты» («дублон» - это испанская золотая монета). Таким образом, вы используете просто NSMutableSet и добавляете к нему NSDictionaries.

NSMutableSet aSet = [NSMutableSet new]; 
[aSet addObject:dico1]; 
.... 
+0

Я не знал, что NSSet удаляет автоматически дубликаты. Он работает очень хорошо, но он не работает с пользовательскими объектами. Я больше искал решение, которое позволяет фильтровать с помощью данного «ключа». У вас есть предложение? – klefevre

+0

Если у вас есть пользовательские объекты, вам нужно перезаписать хеш: и isEqual :. hash: возвращает NSUInteger, который должен быть равен для двух объектов (но может быть равен для двух разных объектов, он должен быть просто быстрым) и isEqual: для проверки точного равенства. –

+0

Работает как шарм, спасибо – klefevre

0

Вы можете использовать NSMutableSet вместо NSArray. Класс NSSet имеет такие методы, как * - (void) setSet: (NSSet ) otherSet. NSSet (и NSMutableSet) проверяют, являются ли двойные объекты.

1

Попробуйте это.

NSArray *hasDuplicates = [NSArray arrayWithObjects:@"first", @"second", @"first", nil]; 
NSArray *noDuplicates = [[NSSet setWithArray: hasDuplicates] allObjects]; 

NSLog(@"%@ %@",hasDuplicates,noDuplicates); 
+0

Он работает, но предполагает, что я уже добавил tempArray в currentArray (со всеми его дублирующими элементами). Я не думаю, что это самый эффективный способ объединить два массива. Но, в любом случае, спасибо за то, что я научился NSSet обрабатывать дубликаты автоматически. – klefevre

+0

Форма Thorsten S. предлагает просто попытаться реализовать это. NSMutableSet * mset = [NSMutableSet new]; [mset addObjectsFromArray: currentArray]; [mset addObjectsFromArray: tempArray]; NSLog (@ "% @", mset); –

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