对swift数组进行排序并跟踪原始索引

时间:2016-09-12 20:25:16

标签: arrays swift sorting

我想对快速数组进行排序并跟踪原始索引。例如: 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]

有没有一种简单的方法可以做到这一点?

5 个答案:

答案 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获取元组(值索引),然后按值对压缩数组进行排序,如果需要单独的值和索引数组,则解压缩