我想对快速数组进行排序并跟踪原始索引。例如: arrayToSort = [1.2,5.5,0.7,1.3]
indexPosition = [0,1,2,3]
sortedArray = [5.5,1.3,1.2,0.7]
indexPosition = [1,3,0,2]
有没有一种简单的方法可以做到这一点?
答案 0 :(得分:7)
最简单的方法是使用枚举。 Enumerate按照它们出现的顺序为数组中的每个元素提供一个索引,然后您可以单独处理它们。
let sorted = arrayToSort.enumerate().sort({$0.element > $1.element})
这导致[(。0 1,.1 5.5),(。0 3,.1 1.3),(。0 0,.1 1.2),(。0 2,.1 0.7)]
要对索引进行排序:
let justIndices = sorted.map{$0.index} // [1, 3, 0, 2]
答案 1 :(得分:1)
也许是这些方面的东西
let arrayToSort = [1.2, 5.5, 0.7, 1.3]
var oldIndices = [Int]()
let sortedArray = arrayToSort.sort { $0 > $1 }
var newIndices = [Int]()
for element in arrayToSort
{
oldIndices.append(arrayToSort.indexOf(element)!)
newIndices.append(sortedArray.indexOf(element)!)
}
print(oldIndices)
print(newIndices)
你也可以使用元组。
var indices = [(Int,Int)]()
indices.append((arrayToSort.indexOf(element)!,sortedArray.indexOf(element)!))
答案 2 :(得分:1)
您可以使用struct
轻松完成此操作,以跟上索引位置。
struct Foo {
var value: Double
var position: Int
}
let arrayToSort = [Foo(value: 1.2, position: 0), Foo(value: 5.5, position: 1), Foo(value: 0.7, position: 2), Foo(value: 1.3, position: 3)]
let sortedArray = arrayToSort.sorted { $0.value > $1.value }
let indexPosition = sortedArray.map { $0.position }
答案 3 :(得分:0)
感谢@twiz_的回答,我认为Swift3中的语法有所改变,我在操场上验证了以下代码。它的工作原理
let arrayToSort = [1.2, 5.5, 0.7, 1.3]
let sorted = arrayToSort.enumerated().sorted(by: {$0.element > $1.element}) // [(1, 5.5), (3, 1.3), (0, 1.2), (2, 0.69999999999999996)]
let justIndices = sorted.map{$0.offset} // [1, 3, 0, 2]
答案 4 :(得分:0)
只需使用zip获取元组(值索引),然后按值对压缩数组进行排序,如果需要单独的值和索引数组,则解压缩