按数字按字母顺序排序数组

时间:2015-07-03 14:30:21

标签: ios swift

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 })中使用了这个函数,但它按照这种方式排序

[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]

8 个答案:

答案 0 :(得分:42)

另一种变体是使用 localizedStandardCompare:。来自文档:

  

只要文件名或其他字符串是,就应该使用此方法   在类似Finder的排序的列表和表格中显示   合适的。

这将根据当前语言环境对字符串进行排序。 例如:

{{1}}

更新:对于Swift 1.2,上述答案相当陈旧。一个 Swift 3 版本(感谢@Ahmad):

{{1}}

有关其他方法,请参阅https://stackoverflow.com/a/31209763/1187415, 在https://stackoverflow.com/a/39748677/1187415翻译成Swift 3。

答案 1 :(得分:11)

Duncan C's answer的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"]

或者,如果要对数组进行就地排序:

var myArray = ["Step 6", "Step 12", "Step 10"]

myArray.sort {
    $0.compare($1, options: .numeric) == .orderedAscending
}

print(myArray) // ["Step 6", "Step 10", "Step 12"]

答案 2 :(得分:7)

NSString有一组丰富的比较字符串的方法。您可以使用方法compare:options:

您需要NSNumericSearch选项。如果您阅读该选项的说明,则说:

  

字符串中的数字使用数值进行比较,即   Name2.txt&lt; Name7.txt&lt; Name25.txt。

所以你可以编写一个Swift排序行来完成你想要的功能。

这样的事情:

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]

答案 3 :(得分:6)

在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}这样的东西我的操场崩溃了。看起来像个臭虫。)

答案 4 :(得分:0)

在Swift 2.0 Demo link中进行排序,将语法从“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 Demo

答案 5 :(得分:0)

NSArray *assorted = [@"1 2 3 9 ; : 구 , 결 A B C Z ! á" 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]|;         
}];

答案 6 :(得分:0)

let myArray = [“步骤6”,“步骤12”,“步骤10”]

let sortedArray = myArray.sorted(by:{x,y in 返回x.field.name.compare(y.field.name,选项:.numeric,范围:nil,locale:nil)== .orderedAscending })

答案 7 :(得分:-1)

你可以使用一个等于数组长度的循环, for(i=0;i<myArray.length;i++),然后可以使用变量对它们进行排序,如:

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;
    }
  }
}