Сравните два массива с одинаковым значением, но с другим порядком

У меня есть 2 nsarray с одинаковыми значениями, но в другом порядке.

NSArray * array1 = {0,1,2,3}
NSArray * array2 = {2,3,1,0}

Мне нужен метод для определения того, имеют ли два массива одинаковые значения в другом порядке.

Вид

-(BOOL) isSameValues:(NSArray*)array1 and:(NSArray*)array2; 

 if ([[NSSet setWithArray:array1] isEqualToSet:[NSSet setWithArray:array2]]) { // the objects are the same } 

Вы можете использовать NSCountedSet для этой цели:

 - (BOOL)isSameValues:(NSArray*)array1 and:(NSArray*)array2 { NSCountedSet *set1 = [NSCountedSet setWithArray:array1]; NSCountedSet *set2 = [NSCountedSet setWithArray:array2]; return [set1 isEqualToSet:set2]; } 

NSCountedSet – это набор различных объектов, каждый из которых имеет связанный с ним счетчик. Поэтому результат для

 NSArray *array1 = @[@0,@1,@2,@3]; NSArray *array2 = @[@2,@3,@1,@0]; 

YES , но для

 NSArray *array1 = @[@1,@1,@3,@3]; NSArray *array2 = @[@3,@3,@3,@1]; 

в результате NO .

Обновление: это не будет работать, если массивы имеют повторяющиеся элементы!

Вы можете создать два NSSet с этими массивами и сравнить их.

 NSArray * array1 = @[@0,@1,@2,@3]; NSArray * array2 = @[@2,@3,@1,@0]; NSSet *set1 = [NSSet setWithArray:array1]; NSSet *set2 = [NSSet setWithArray:array2]; NSLog(@"result %@", [set1 isEqualToSet:set2] ? @"YES" : @"NO"); 

Возьмите общее количество элементов. Есть счетчик. И поместите двойной цикл «for» для анализа каждого элемента друг друга. Увеличивайте счетчик при каждом совпадении. Примечание: Это действительно, когда все элементы уникальны.

Если они отличаются или вы не знаете, сортируйте их и сопоставьте друг с другом.

Другой способ – использовать NSHashTable .

 - (BOOL)array:(NSArray *)array1 containsTheSameObjectsAsArray:(NSArray *)array2 { if (array1.count != array2.count) { return NO; } NSHashTable *table = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory capacity:array1.count]; for (NSObject *object in array1) { [table addObject:object]; } for (NSObject *object in array2) { if (![table containsObject:object]) { return NO; } } return YES; } 

Обратите внимание: NSHashTable требует iOS 6+

  • Как передать объект с помощью NSNotificationCenter
  • Сортировка NSArray строк или объектов даты
  • Создание UIImage в форме круга
  • Какова максимальная длина объекта NSString?
  • Отправить почту без MFMailComposeViewController
  • Лучшая библиотека Cocoa / Objective-C Wrapper для SQLite на iPhone
  • Поиск NSArray для значения соответствия значений
  • Есть ли способ подавить предупреждения в Xcode?
  • Использование MPMediaItems с AVAudioPlayer
  • NULL против нуля в Objective-C
  • Запустите NSRunLoop в командной строке программы Cocoa
  • Interesting Posts

    Связать FTP-ссылки с FileZilla в Win8 (или любой конкретный exe с протоколом)

    Почему некоторые папки будут скопированы с неправильной меткой времени?

    Какой порт и протокол использует Google Cloud Messaging (GCM)?

    Как получить список IP-соединений, подключенных в одной сети (подсеть), используя Java

    ASP.NET MVC5 / IIS Express не может отлаживать – код не работает

    Как написать запрос в Microsoft SQL Server Management Studio, а затем использовать этот запрос в Excel

    Рисование сферы в OpenGL без использования gluSphere ()?

    Форматирование числа с необязательными десятичными знаками в Excel

    Содержит ли соединение сокетов TCP «поддерживать»?

    Как правильно писать код C / C ++, когда нулевой указатель не все биты нуль

    Как указать параметр заголовков для пользовательских действий с угловым $ ресурсом

    Преобразование строки Java в дату

    Различия в производительности между ArrayList и LinkedList

    Используйте тип Enum в качестве параметра значения для @ RolesAllowed-Annotation

    Отклонить двоичный код с состоянием, ожидающим проверки (не может найти двоичную кнопку отклонения)

    Давайте будем гением компьютера.