У меня есть массив Booleans, что я хотел бы разобраться:Сортировать Bool Массив
var array = [true,false,true,false]
им не уверен, как использовать упорядоченный метод:
playersArray.sorted(by: (Bool, Bool) -> Bool)
Заранее спасибо
У меня есть массив Booleans, что я хотел бы разобраться:Сортировать Bool Массив
var array = [true,false,true,false]
им не уверен, как использовать упорядоченный метод:
playersArray.sorted(by: (Bool, Bool) -> Bool)
Заранее спасибо
Метод 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
раз быстрее.
Спасибо, удивительное объяснение! – extrablade
понял!
array.sorted {$0.description > $1.description}
Это преобразует каждый из bools в строки. Не рекомендуется. – emlai
Сравните http://stackoverflow.com/questions/28781031/swift-sort-array-of-objects-based-on-boolean-value. –