2017-02-04 2 views
0

У меня есть массив Booleans, что я хотел бы разобраться:Сортировать Bool Массив

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

им не уверен, как использовать упорядоченный метод:

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

Заранее спасибо

+0

Сравните http://stackoverflow.com/questions/28781031/swift-sort-array-of-objects-based-on-boolean-value. –

ответ

2

Метод 1: Используйте sorted с минимальным закрытием

Если вы собираетесь использовать sorted, и вы хотите true s быть первым, он может просто быть записан как:

let sorted = array.sorted { $0 && !$1 } 

Объяснение

Закрытие, которое вы предоставляете sorted, принимает 2 Bool и возвращает Bool. На основании предоставленных вами закрытие, вот таблица, которая отображает вход 2 Bool до нужного выхода:

input   desired answer 
------------- -------------- 
false < true  false 
true < false true 
false < false false 
true < true  false 

Поскольку вы хотите true появиться первым в массиве затем true < false и false > true.

Итак, вы хотите вернуть true, когда первый вход является истинным, а второй - ложным. Это можно написать просто как { $0 && !$1 }.


Метод 2: Radix Сортировка

Поскольку существует только два значения, было бы более эффективным, чтобы просто посчитать один из них, а затем создать массив, который имеет право количество true с и false s. Это будет работать в линейном времени O (n), которое быстрее, чем сортировка для больших массивов.

let trueCount = array.reduce(0) { $0 + ($1 ? 1 : 0) } 
let sorted = Array(repeating: true, count: trueCount) + 
      Array(repeating: false, count: array.count - trueCount) 

Сравнение производительности

Вот сравнение 3 методов в массиве 10,000 элемент работает на 2,4 ГГц i5 MacBook Pro. Это был скомпилирован в режиме выпуска:

sorting function   time for 100 runs (seconds) 
----------------   -------------- 
Your answer    0.44872701 
Method 1     0.18970698 
Method 2     0.00229198 

Метод сортировки радикс примерно 82 раз быстрее.

+0

Спасибо, удивительное объяснение! – extrablade

0

понял!

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

Это преобразует каждый из bools в строки. Не рекомендуется. – emlai

Смежные вопросы