2017-02-04 3 views
0

ich ein Array von Boolesche Werte haben, die Ich mag wird sortieren:Sortieren Bool Array

var array = [true,false,true,false] 

im nicht sicher, wie die sortierte Methode verwenden:

playersArray.sorted(by: (Bool, Bool) -> Bool) 

Vielen Dank im Voraus

+0

Vergleichen Sie http://stackoverflow.com/questions/28781031/swift-sort-array-of-objects-based-on-boolean-value. –

Antwort

2

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.

+0

Danke, tolle Erklärung! – extrablade

0

Ich habs!

array.sorted {$0.description > $1.description} 
+1

Dies wird jeden der Bools in Strings konvertieren. Nicht empfohlen. – emlai