2016-09-12 8 views
0

私は素早い配列をソートし、元のインデックスを追跡します。例えば: 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

あなたは2つの別々のアレイを維持していますか? – Santosh

答えて

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)!)) 
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 } 
4

最も簡単な方法は列挙です。 Enumerateは、配列内の各要素に、表示されている順序でインデックスを渡します。次に、それらを別々に扱うことができます。

let sorted = arrayToSort.enumerate().sort({$0.element > $1.element}) 

これは[(0.0 1 0.1 5.5)、(0.0 3 0.1 1.3)、(0.0 0 0.1 1.2)、(0.0 2 0.1 0.7)になります]

をソートインデックス取得するには:@twiz_から答えを

let justIndices = sorted.map{$0.index} // [1, 3, 0, 2] 
0

おかげで、私は構文は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] 
関連する問題