按数字字母顺序排列数组
myArray = [Step 6, Step 12, Step 5, Step 14, Step 4, Step 11, Step 16, Step 9, Step 3, Step 13, Step 8, Step 2, Step 10, Step 7, Step 1, Step 15]
我怎样才能以这种方式排列这个数组?
[Step 1, Step 2, Step 3, Step 4, ....]
我在swift中使用了这个函数sort(&myArray,{ $0 < $1 })
但是这样sorting
[Step 1, Step 10, Step 11, Step 12, Step 13, Step 14, Step 15, Step 16, Step 2, Step 3, Step 4, Step 5, Step 6, Step 7, Step 8, Step 9]
另一个变体是使用localizedStandardCompare:
从文档:
只要文件名或其他string以列表和表格的forms出现在Findertypes的sorting适当的地方,就应该使用这种方法。
这将根据当前语言环境对string进行sorting。 例:
let myArray = ["Step 6", "Step 12", "Step 10"] let ans = sorted(myArray,{ (s1, s2) in return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedAscending }) println(ans) // [Step 6, Step 10, Step 12]
更新:上面的答案是相当古老的Swift 1.2。 Swift 3版本(感谢@Ahmad):
let ans = myArray.sorted { (s1, s2) -> Bool in return s1.localizedStandardCompare(s2) == .orderedAscending }
有关其他方法,请参阅https://stackoverflow.com/a/31209763/1187415 ,转换为Swift 3, url为https://stackoverflow.com/a/39748677/1187415 。
在Swift 2中:
import Foundation let myArray = ["Step 6", "Step 12", "Step 10"] extension String { func extractIntFromEnd() -> Int? { return self.componentsSeparatedByString(" ").last.flatMap{Int($0)} } } let ans = myArray.sort { (first, second) in first.extractIntFromEnd() < second.extractIntFromEnd() }
在Swift 1:
let myArray = ["Step 6", "Step 12", "Step 10"] extension String { func extractIntFromEnd() -> Int? { return self.componentsSeparatedByString(" ").last.flatMap{$0.toInt()} } } let ans = myArray.sorted { (first, second) in first.extractIntFromEnd() < second.extractIntFromEnd() }
在这两个数组中,
let myArray = [ "Step 6" , "Step 12", "Step 5" , "Step 14", "Step 4" , "Step 11", "Step 16", "Step 9" , "Step 3" , "Step 13", "Step 8" , "Step 2" , "Step 10", "Step 7" , "Step 1" , "Step 15" ]
会给你这个答案:
["Step 1", "Step 2", "Step 3", "Step 4", "Step 5", "Step 6", "Step 7", "Step 8", "Step 9", "Step 10", "Step 11", "Step 12", "Step 13", "Step 14", "Step 15", "Step 16"]
(在Swift 2.0版本中,你应该能够执行last.flatMap(Int.init)
,但由于某些原因,它不适用于我,甚至像["1", "2"].flatMap(Int.init)
正在撞击我的操场,看起来像一个错误。)
NSString有一套丰富的比较string的方法。 你可以使用方法compare:options:
。
你需要NSNumericSearch
选项。 如果您阅读了该选项的说明,则说:
string中的数字使用数值进行比较,即Name2.txt <Name7.txt <Name25.txt。
所以你可以写一个Swift的分类行来完成你想要的function。
像这样的东西:
let myArray = ["Step 6", "Step 12", "Step 10"] let ans = myArray.sorted { (first, second) in first.compare(second, options: .NumericSearch) == NSComparisonResult.OrderedAscending } println(ans) // [Step 6, Step 10, Step 12]
邓肯C的 Swift 3版的答案是
let myArray = ["Step 6", "Step 12", "Step 10"] let sortedArray = myArray.sorted { $0.compare($1, options: .numeric) == .orderedAscending } print(sortedArray) // ["Step 6", "Step 10", "Step 12"]
或者,如果你想对数组进行sorting:
var myArray = ["Step 6", "Step 12", "Step 10"] myArray.sort { $0.compare($1, options: .numeric) == .orderedAscending } print(myArray) // ["Step 6", "Step 10", "Step 12"]
在Swift 2.0 Demo链接中进行sorting,将语法从“sorted(myArray,{})”更改为“myArray.sort({})”。 可扩展协议。
let myArray = ["Step 6", "Step 12", "Step 10"] let sortedArray = myArray.sort({ x, y in return x.localizedStandardCompare(y) == NSComparisonResult.OrderedAscending }) dump(sortedArray)
Swift 1.2演示
NSArray *assorted = [@"1 2 3 9 ; : 구 , 결 ABCZ ! á" componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSArray *sorted = [assorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { /* NSOrderedAscending, NSOrderedSame, NSOrderedDescending */ BOOL isPunct1 = [[NSCharacterSet punctuationCharacterSet] characterIsMember:[(NSString*)obj1 characterAtIndex:0]]; BOOL isPunct2 = [[NSCharacterSet punctuationCharacterSet] characterIsMember:[(NSString*)obj2 characterAtIndex:0]]; if (isPunct1 && !isPunct2) { return NSOrderedAscending; } else if (!isPunct1 && isPunct2) { return NSOrderedDescending; } return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch|NSNumericSearch]|; }];
你可以使用一个等于数组长度的循环, 也就是说, for(i=0;i<myArray.length;i++)
,然后可以使用一个variables按如下顺序对它们进行sorting:
for (int i = 0; i < myArray.length; i++) { for (int j = i + 1; j < n; j++) { if (a[i] > a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } } }