Как отсортировать 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 – это массив времени в секундах, в течение которого пользователь был активен в моем приложении. Я хотел бы заказать, чтобы нисходящие или восходящие и другие массивы менялись, чтобы оставаться последовательными.

4 Solutions collect form web for “Как отсортировать 1 массив в Swift / Xcode и переупорядочить несколько других массивов теми же изменениями клавиш”

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

 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} 
  • Приложение не работает должным образом в фоновом режиме без Xcode
  • Как мне создать двоичный файл armv7 arm64 fat, который будет работать на iOS 5-7?
  • OpenGL vs Cocos2d: что выбрать?
  • TARGET_OS_IPHONE и ApplicationTests
  • Шаги по тестированию приложения iphone на устройстве (уже создан профиль / сертификат)
  • Сделайте снимок экрана с помощью кода
  • Не удается получить иконки приложений для работы в Xcode 6
  • Настройка сборки Xcode «Путь сборки продуктов» (CONFIGURATION_BUILD_DIR) - ложь?
  • Как настроить общую инфраструктуру для iOS и OS X
  • iOS получает уведомления Media Player, когда приложение находится в фоновом режиме
  • Ошибка iphonesimulator (SDK не найдена) в xcode
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.