如何在Swift / Xcode中sorting1个数组,并通过相同的键更改重新排列多个其他数组

对不起,这个问题的复杂措辞。 我的主要经验是使用PHP,它有一个名为array_multisort的命令。 语法如下:

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

它可以让你sorting1arrays和重新sorting多个其他数组基于原来的关键变化。

在Swift / Xcode 7.2中是否有等价的命令?

我目前有一组数组:

名字年龄城市国家活跃

活动是用户在我的应用程序中处于活动状态的时间数组。 我想命令下降或上升和其他arrays改变保持一致。

你可以按sorting顺序创build一个索引数组,并将其用作映射:

 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]}) 

[编辑]这是对技术的改进:

这是一样的方法,但一步完成sorting和分配。 (可以重新分配给原始数组或分开)

 (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]和一个数组扩展名,使它更容易使用,如果你正在sorting:

 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:<)) 

我会去@AntonBronnikovbuild议,并把所有的属性到一个结构,使一个特定的struct Array ,然后sorting。

这些数据显然是相关的,这是一个更清洁的方法。

编辑这个对于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的解决scheme是更喜欢,但扩展各种选项,下面的解决scheme模仿什么样的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}