如何在Swift中对数组进行sorting
我想要这个代码的Swift版本:
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
var names = [ "Alpha", "alpha", "bravo"] var sortedNames = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
更新:根据SO用户的build议提供解释。
与ObjC不同的是,在Swift中,你有sort()(和sort())方法,它接受一个你提供的闭包,返回一个布尔值来表示一个元素应该在另一个元素之前(true)还是之后(false)。 $ 0和$ 1是要比较的元素。 我使用localizedCaseInsensitiveCompare来获得你正在寻找的结果。 现在,localizedCaseInsensitiveCompare返回sorting的types,所以我需要修改它以返回适当的布尔值。
Swift 2的更新: sorted
和sort
被sort
和sortInPlace
replace
在Swift中对数组进行sorting
定义一个初始名称数组:
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]"
如果你的数组不包含自定义对象(只是一个string或数字types):
var sortedNames = sorted(names, <)
否则,如果在里面创build一个包含自定义属性的自定义数据对象类
customDataObjectArray.sort({ $0.customProperty < $1.customProperty })
SWIFT中最有效的sorting方式
运算符重载是使用Swift语言对Strings进行sorting的最有效的方法。
// OPERATOR OVERLOADING let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] var sortedNames = sorted(names, <) var reverseOrder = sorted(names, >)
在上面的代码中>
和<
运算符在Swift中重载以对string进行sorting。
我已经testing了Playground中的代码,并得出结论,当我们使用运算符重载时,最好是对string进行sorting。
复制到游乐场。
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, >)
游乐场的结论:
从上面的图片你可以看到,所有其他的方式需要枚举循环sorting5个string。 当我们使用运算符重载时,不需要枚举循环来对string进行sorting。
从Swift文档引用
如果你想按升序排列你的数组,然后使用下面的语法:
var arrayName = sorted(arrayName, <)
因为sorted()是swift中的预定义函数,而<用于指示数组应按升序sorting。 如果要按降序对数组进行sorting,则只需将< with >replace为如下所示:
var arrayName = sorted(arrayName, >)
你通常可以使用内置的
func sort<T : Comparable>(inout array: [T])
但是如果你想使用localizedCaseInsensitiveCompare:
,你的代码可以直接使用NSArray
进行翻译。
任何可以与Objective-C sortedArrayUsingSelector:
一起使用的方法都可以与Swift sort
(或sorted
)一起使用,前提是数组中的事物的types是已知的。 所以,在你的代码中:
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}
在Swift-
let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"] let sortedStudents = students.sorted() print(sortedStudents) // Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
要按降序sorting序列的元素,请将大于运算符(>)传递给sorting的(isOrderedBefore :)方法。
let descendingStudents = students.sorted(isOrderedBefore: >) print(descendingStudents) // Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"