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

Pot*_*ter 43 swift

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

NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
Run Code Online (Sandbox Code Playgroud)

Mir*_*ekE 69

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

更新:根据SO用户的建议提供解释.

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

更新斯威夫特2: sortedsort由被替换sortsortInPlace


Sel*_*lva 20

在Swift中对数组进行排序

定义初始名称数组:

var names = [ "gamma", "Alpha", "alpha", "bravo"]
Run Code Online (Sandbox Code Playgroud)

方法1:

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

这可以进一步简化为:

var sortedNames = sorted(names, <)
// ["Alpha", "alpha", "bravo", "gamma"]
var reverseSorted = sorted(names, >)
// ["gamma", "bravo", "alpha", "Alpha"]
Run Code Online (Sandbox Code Playgroud)

方法2:

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


eri*_*cgu 18

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

var sortedNames = sorted(names, <)
Run Code Online (Sandbox Code Playgroud)

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

customDataObjectArray.sort({ $0.customProperty < $1.customProperty })
Run Code Online (Sandbox Code Playgroud)


Kam*_*pai 7

最有效的SWIFT排序方式

使用运算符重载是在Swift语言中对字符串进行排序的最有效方法.

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

在上面的代码中>,<运算符在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, >)
Run Code Online (Sandbox Code Playgroud)

游乐场的结论:

在此输入图像描述

从上面的图像中,您可以看到所有其他方法需要枚举循环以对5个字符串进行排序.当我们使用运算符重载时,它不需要枚举循环来排序字符串.

参考Swift文档