Methode 1: Verwenden sorted
mit einem minimalen Verschluss
Wenn Sie sorted
verwenden wollen, und Sie wollen, dass die true
erste sein, es kann nur geschrieben werden als:
let sorted = array.sorted { $0 && !$1 }
Erklärung
Die von Ihnen an sorted
angegebene Schließung dauert 2 Bool
und gibt eine Bool
zurück. Auf der Grundlage der Schließung Sie zur Verfügung gestellten, hier ist eine Tabelle, die die Eingabe von 2 Bool
auf die gewünschten Ausgangskarten:
input desired answer
------------- --------------
false < true false
true < false true
false < false false
true < true false
Da Sie true
zuerst in Ihrem Array erscheinen sollen dann true < false
und false > true
.
Sie möchten also true
zurückgeben, wenn der erste Eingang wahr und der zweite Eingang falsch ist. Dies kann einfach als { $0 && !$1 }
geschrieben werden.
Methode 2: Radix Sort
Da es nur zwei Werte sind, wäre es effizienter sein, nur einer von ihnen zu zählen und dann ein Array erstellen, die die richtige Anzahl von true
s hat und false
s. Dies würde in linearer Zeit O (n) ablaufen, was schneller ist als das Sortieren nach großen Arrays.
let trueCount = array.reduce(0) { $0 + ($1 ? 1 : 0) }
let sorted = Array(repeating: true, count: trueCount) +
Array(repeating: false, count: array.count - trueCount)
Leistungsvergleiche
Hier ist ein Vergleich der drei Methoden auf einer 10,000
Elementanordnung auf einem 2,4-GHz-i5 läuft MacBook Pro. Dies wurde im Release-Modus kompiliert:
sorting function time for 100 runs (seconds)
---------------- --------------
Your answer 0.44872701
Method 1 0.18970698
Method 2 0.00229198
Die Radixsort Methode etwa 82
mal schneller ist.
Vergleichen Sie http://stackoverflow.com/questions/28781031/swift-sort-array-of-objects-based-on-boolean-value. –