如何在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}