Подтвердить что ты не робот

Как отсортировать массив в Swift

Я хочу версию Swift этого кода:

NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
4b9b3361

Ответ 1

var names = [ "Alpha", "alpha", "bravo"]
var sortedNames = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }

Обновление: предоставление объяснений в соответствии с рекомендациями другого пользователя SO.

В отличие от ObjC, в Swift вы отсортировали() (и sort()) метод, который берет закрытие, которое вы поставляете, которое возвращает логическое значение, чтобы указать, должен ли один элемент быть перед (истинным) или после (false) другим элементом, Элементы для сравнения - $0 и $1. Я использовал localizedCaseInsensitiveCompare, чтобы получить результат, который вы ищете. Теперь localizedCaseInsensitiveCompare возвращает тип упорядочения, поэтому мне нужно было изменить его, чтобы вернуть соответствующее значение bool.

Обновление для Swift 2: sorted и sort были заменены на sort и sortInPlace

Ответ 2

Сортировка массива в Swift

Определите массив начальных имен:

var names = [ "gamma", "Alpha", "alpha", "bravo"]

Метод 1:

var sortedNames = sorted(names, {$0 < $1})
// sortedNames becomes "[Alpha, alpha, bravo, gamma]"

Это может быть дополнительно упрощено:

var sortedNames = sorted(names, <)
// ["Alpha", "alpha", "bravo", "gamma"]
var reverseSorted = sorted(names, >)
// ["gamma", "bravo", "alpha", "Alpha"]

Метод 2:

names.sort(){$0 < $1}
// names become sorted as this --> "[Alpha, alpha, bravo, gamma]"

Ответ 3

Если ваш массив не содержит пользовательских объектов (просто строка или тип номера):

var sortedNames = sorted(names, <)

В противном случае, если вы создадите класс объектов пользовательских данных, содержащий пользовательские свойства внутри:

customDataObjectArray.sort({ $0.customProperty < $1.customProperty })

Ответ 4

Самый эффективный способ сортировки в SWIFT

Использование Перегрузка оператора - наиболее эффективный способ сортировки строк на языке Swift.

// OPERATOR OVERLOADING
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var sortedNames = sorted(names, <)
var reverseOrder = sorted(names, >)

В приведенных выше командах > и < операторы перегружены в Swift для сортировки строк.

Я тестировал код в Playground и пришел к выводу, что при использовании перегрузки оператора лучше всего сортировать строки.

Скопируйте ниже на Playground.

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

var reversed = sorted (names,
    // This is a closure
    { (s1 : String, s2 : String) -> Bool in
        return s1 > s2
    }
)
println(reversed)

var reverseOrder = sorted(names, {s1, s2 in s1 > s2})

var reverseOrder2 = sorted(names, { $0 > $1} )

// OPERATOR OVERLOADING
var reverseOrder3 = sorted(names, >)

Вывод из игровой площадки:

enter image description here

Из вышеприведенного изображения вы можете видеть, что все остальные способы должны перечислять циклы для сортировки 5 строк. Где, как при использовании перегрузки Operator, не требуется перечислять цикл для сортировки строк.

Ссылка из документация Swift

Ответ 5

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

var arrayName = sorted(arrayName, <)

поскольку sorted() является предопределенной функцией в swift и < используется для указания того, что массив следует сортировать в порядке возрастания. Если вы хотите отсортировать массив в порядке убывания, просто замените < на , как показано ниже:

var arrayName = sorted(arrayName, >)

Ответ 6

Обычно вы можете использовать встроенный

func sort<T : Comparable>(inout array: [T])

но если вы хотите использовать localizedCaseInsensitiveCompare:, ваш код может быть переведен непосредственно с помощью NSArray.

Ответ 7

Любой метод, который можно использовать с Objective-C sortedArrayUsingSelector:, можно использовать с Swift sort (или sorted) при условии, что тип вещи в массиве известен. Итак, в вашем коде:

var arr : [String] = // ...
// it is an array of String, so we can use localizedCaseInsensitiveCompare:
sort(&arr) {return $0.localizedCaseInsensitiveCompare($1) == .OrderedAscending}

Аналогично:

var events : [EKEvent] = // ...
sort(&events) {return $0.compareStartDateWithEvent($1) == .OrderedAscending}

Ответ 8

В Swift -

let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = students.sorted()
print(sortedStudents)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"

Чтобы отсортировать элементы вашей последовательности в порядке убывания, передайте оператор больше ( > ) в отсортированный (isOrderedBefore:) метод.

let descendingStudents = students.sorted(isOrderedBefore: >)
print(descendingStudents)
// Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"