Как отсортировать 1 массив в Swift / Xcode и переупорядочить несколько других массивов теми же изменениями клавиш

Извините за сложную формулировку вопроса. Мой главный опыт работы с PHP, и у него есть команда array_multisort. Синтаксис приведен ниже:

bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $... ]]] ) 

Он позволяет сортировать массив 1 и переупорядочивать несколько других массивов на основе изменений ключа в оригинале.

Есть ли эквивалентная команда в Swift / Xcode 7.2?

В настоящее время у меня есть набор массивов:

FirstName Возраст Город Страна

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

Вы можете создать массив индексов в отсортированном порядке и использовать его в качестве отображения:

 var names = [ "Paul", "John", "David" ] var ages = [ 35, 42, 27 ] let newOrder = names.enumerate().sort({$0.1<$1.1}).map({$0.0}) names = newOrder.map({names[$0]}) ages = newOrder.map({ages[$0]}) 

[EDIT] Вот улучшение по технике:

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

 (firstNames,ages,cities,countries,actives) = {( $0.map{firstNames[$0]}, $0.map{ages[$0]}, $0.map{cities[$0]}, $0.map{countries[$0]}, $0.map{actives[$0]} )} (firstNames.enumerated().sorted{$0.1<$1.1}.map{$0.0}) 

[EDIT2] и расширение Array, чтобы сделать его еще проще в использовании, если вы сортируете на месте:

 extension Array where Element:Comparable { func ordering(by order:(Element,Element)->Bool) -> [Int] { return self.enumerated().sorted{order($0.1,$1.1)}.map{$0.0} } } extension Array { func reorder<T>(_ otherArray:inout [T]) -> [Element] { otherArray = self.map{otherArray[$0 as! Int]} return self } } firstNames.ordering(by: <) .reorder(&firstNames) .reorder(&ages) .reorder(&cities) .reorder(&countries) .reorder(&actives) 

сочетая предыдущие два:

 extension Array { func reordered<T>(_ otherArray:[T]) -> [T] { return self.map{otherArray[$0 as! Int]} } } (firstNames,ages,cities,countries,actives) = {( $0.reordered(firstNames), $0.reordered(ages), $0.reordered(cities), $0.reordered(countries), $0.reordered(actives) )} (firstNames.ordering(by:<)) 

Я бы пошел с предложением @AntonBronnikov и поместил все ваши свойства в структуру, создав Array этой конкретной struct а затем отсортировав ее.

Эти данные четко взаимосвязаны, и это более чистый подход.

Изменить это допустимо для 2 массивов:

Добавляем к ответу @AlainT, но используя zip :

 var names = [ "Paul", "John", "David" ] var ages = [ 35, 42, 27 ] let sortedTuple = zip(names, ages).sort { $0.0.0 < $0.1.0 } 

Что-то более общее:

 names.enumerate().sort({$0.1<$1.1}).map({ (name: $0.1, age: ages[$0.0]) }) 

Я считаю, что решение AlainT: s предпочтительнее, но чтобы расширить множество вариантов, ниже следует решение, имитирующее то, что метод zip5 мог бы дать нам достичь (в случае, если мы могли бы использовать zip для смены 5 последовательностей вместо своего предела 2) :

 /* example arrays */ var firstName: [String] = ["David", "Paul", "Lisa"] var age: [Int] = [17, 27, 22] var city: [String] = ["London", "Rome", "New York"] var country: [String] = ["England", "Italy", "USA"] var active: [Int] = [906, 299, 5060] /* create an array of 5-tuples to hold the members of the arrays above. This is an approach somewhat mimicking a 5-tuple zip version. */ var quinTupleArr : [(String, Int, String, String, Int)] = [] for i in 0..<firstName.count { quinTupleArr.append((firstName[i], age[i], city[i], country[i], active[i])) } /* sort wrt 'active' tuple member */ quinTupleArr.sort { $0.4 < $1.4 } /* map back to original arrays */ firstName = quinTupleArr.map {$0.0} age = quinTupleArr.map {$0.1} city = quinTupleArr.map {$0.2} country = quinTupleArr.map {$0.3} active = quinTupleArr.map {$0.4} 
  • iOS: как найти позицию вставки в отсортированном NSMutableArray
  • Как сортировать NSArray объектов на основе одного атрибута
  • NSFetchedResultsController сортирует по имени или фамилии
  • Сортировка nsarray строк, не основанных на строках
  • Swift Stable Sort?
  • Сортировка NSFetchedResultsController по быстрому вычисляемому свойству в NSManagedObjectSubclass
  • NSFetchedResultsController сортирует разные разделы по-разному (по возрастанию / убыванию)?
  • Сортировка отрицательной числовой строки в iOS с помощью NSStringCompareOptions
  • Сортировка контактов на основе недавно использованных / наиболее часто используемых / срочных запросов в адресной книге iOS
  • Сортировка NSFetchedResultsController по NULL NSDates
  • Есть ли встроенная функция сортировки в Objective C?
  • Interesting Posts

    Приложение для запуска Bluetooth-маяка или генерировать push-уведомление

    В чем разница между CBCentralManagerStatePoweredOn и CBPeripheralManagerState?

    Где установить translatesAutoresizingMaskIntoConstraints в Xcode 4.5

    как избежать фона для изображения, выбранного из фотогалереи или снятого с камеры в ios?

    'strcmp' не был объявлен в этой области

    ios: ждет, пока метод завершит выполнение, прежде чем продолжить

    iOS: вложенная анимация push может привести к повреждению навигационной панели

    Есть ли уведомление для обнаружения AirPlay в Objective-C?

    FetchedResultsController с разделами

    Будет ли физическая клавиатура препятствовать появлению inputAccessoryView?

    Перезагрузка заголовка tableView в ios7

    Тег Parse <img>, который находится в <description> </ description> элемента rss2 feed

    Можно ли добавить трек на музыкальный плеер iPhone из другого приложения?

    IOS: проверьте, находится ли точка внутри прямоугольника

    Создание файла журнала в приложении iOS

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