如何在Swift中对数组进行排序

时间:2014-08-09 21:06:24

标签: swift

我想要这段代码的Swift版本:

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

8 个答案:

答案 0 :(得分:69)

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

更新:根据SO用户的推荐提供解释。

与ObjC不同,在Swift中你有sort()(和sort())方法,它接受你提供的一个闭包,它返回一个布尔值,指示一个元素应该在(true)之前还是之后(false)另一个元素。 $ 0和$ 1是要比较的元素。我使用localizedCaseInsensitiveCompare来获取您要查找的结果。现在,localizedCaseInsensitiveCompare返回排序类型,因此我需要修改它以返回适当的bool值。

Swift 2的更新: sortedsort替换为sortsortInPlace

答案 1 :(得分:20)

在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]"

答案 2 :(得分:17)

如果您的数组不包含自定义对象(只是字符串或数字类型):

var sortedNames = sorted(names, <)

否则,如果您在其中创建包含自定义属性的自定义数据对象类:

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

答案 3 :(得分:7)

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个字符串。当我们使用运算符重载时,它不需要枚举循环来对字符串进行排序。

引自 Swift documentation

答案 4 :(得分:4)

如果要按升序对数组进行排序,请使用以下语法:

var arrayName = sorted(arrayName, <)

因为 sorted()是swift和&lt;中的预定义函数。用于指示数组应按升序排序。如果您想按降序对数组进行排序,只需将&lt; 替换为&gt; ,如下所示:

var arrayName = sorted(arrayName, >)

答案 5 :(得分:2)

您通常可以使用内置的

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

但如果您想使用localizedCaseInsensitiveCompare:,则可以使用NSArray直接翻译您的代码。

答案 6 :(得分:2)

可以与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}

答案 7 :(得分:1)

在Swift中 -

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

要按降序对序列元素进行排序,请将大于运算符(&gt;)传递给sorted(isOrderedBefore :)方法。

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