Swift Language Ordinamento di una matrice


Esempio

var array = [3, 2, 1]

Creazione di un nuovo array ordinato

Dato che Array conforme a SequenceType , possiamo generare una nuova matrice di elementi ordinati usando un metodo di ordinamento incorporato.

2.1 2.2

In Swift 2, questo è fatto con il metodo sort() .

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

A partire da Swift 3, è stato rinominato in sorted() .

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

Ordinamento di un array esistente sul posto

Poiché Array conforme a MutableCollectionType , possiamo ordinare i suoi elementi in posizione.

2.1 2.2

In Swift 2, questo viene fatto usando il metodo sortInPlace() .

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

A partire da Swift 3, è stato rinominato in sort() .

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

Nota: per utilizzare i metodi precedenti, gli elementi devono essere conformi al protocollo Comparable .

Ordinamento di un array con un ordine personalizzato

Si può anche ordinare un array usando una chiusura per definire se un elemento debba essere ordinato prima di un altro - il che non è limitato agli array in cui gli elementi devono essere Comparable . Ad esempio, non ha senso che un Landmark di Landmark sia Comparable , ma è comunque possibile ordinare una serie di punti di riferimento in base all'altezza o al nome.

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: il confronto tra stringhe può produrre risultati imprevisti se le stringhe sono incoerenti, vedere Ordinamento di una matrice di stringhe .