Swift Language Ordenar una matriz


Ejemplo

var array = [3, 2, 1]

Creando una nueva matriz ordenada

Dado que Array ajusta a SequenceType , podemos generar una nueva matriz de los elementos ordenados utilizando un método de clasificación integrado.

2.1 2.2

En Swift 2, esto se hace con el método sort() .

let sorted = array.sort()  // [1, 2, 3]
3.0

A partir de Swift 3, ha sido renombrado a sorted() .

let sorted = array.sorted()  // [1, 2, 3]

Ordenar una matriz existente en su lugar

Como Array ajusta a MutableCollectionType , podemos ordenar sus elementos en su lugar.

2.1 2.2

En Swift 2, esto se hace usando el método sortInPlace() .

array.sortInPlace() // [1, 2, 3]
3.0

A partir de Swift 3, se le cambió el nombre a sort() .

array.sort() // [1, 2, 3]

Nota: Para utilizar los métodos anteriores, los elementos deben cumplir con el protocolo Comparable .

Ordenar una matriz con un orden personalizado

También puede ordenar una matriz utilizando un cierre para definir si un elemento debe ordenarse antes que otro, lo cual no está restringido a matrices donde los elementos deben ser Comparable . Por ejemplo, no tiene sentido que un Landmark de Landmark sea Comparable , pero aún puede ordenar un conjunto de puntos de referencia por altura o nombre.

struct Landmark {
    let name : String
    let metersTall : Int
}

var landmarks = [Landmark(name: "Empire State Building", metersTall: 443),
                 Landmark(name: "Eifell Tower", metersTall: 300),
                 Landmark(name: "The Shard", metersTall: 310)]
2.1 2.2
// sort landmarks by height (ascending)
landmarks.sortInPlace {$0.metersTall < $1.metersTall}

print(landmarks) // [Landmark(name: "Eifell Tower", metersTall: 300), Landmark(name: "The Shard", metersTall: 310), Landmark(name: "Empire State Building", metersTall: 443)]

// create new array of landmarks sorted by name
let alphabeticalLandmarks = landmarks.sort {$0.name < $1.name}

print(alphabeticalLandmarks) // [Landmark(name: "Eifell Tower", metersTall: 300), Landmark(name: "Empire State Building", metersTall: 443), Landmark(name: "The Shard", metersTall: 310)]
3.0
// sort landmarks by height (ascending)
landmarks.sort {$0.metersTall < $1.metersTall}

// create new array of landmarks sorted by name
let alphabeticalLandmarks = landmarks.sorted {$0.name < $1.name}

Nota: la comparación de cadenas puede producir resultados inesperados si las cadenas son inconsistentes, vea Ordenar una matriz de cadenas .