Swift:按字母顺序对数组进行排序

Posted

技术标签:

【中文标题】Swift:按字母顺序对数组进行排序【英文标题】:Swift: Sort Array in Alphabetical Order 【发布时间】:2014-11-08 02:04:22 【问题描述】:

我是 Swift 和 Objective-C 的新手。

我有一个表视图控制器,我在其中声明了一个字典和一个数组:

var parts = [:]
var partsSectionTitles: NSArray!

在我的 viewDidLoad 函数中,我有:

parts = [
        "Part 1" : ["X:1", "X:2", "X:3"],
        "Part 2" : ["X:1", "X:2"],
        "Part 3" : ["X:1"]
    ]

var partsSectionTitles = parts.allKeys

我已经在 Objective-C 中成功完成了这个表格视图控制器,为了按字母顺序对partsSectionTitles 进行排序,我使用了:

partsSectionTitles = [[parts allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

所以,我的问题是:如何在 Swift 中编写前面的 Objective-C 代码?提前感谢您的回答。

更新:我能够使用你们提供的答案中的点点滴滴解决问题。所以谢谢!这是我所拥有的:

我将部件字典声明为:

var parts = [String:[String]]()

这让我可以为每个键提供多个值。这是一个巨大的帮助。

然后我能够创建partsSectionTitles 并对其进行排序:

partsSectionTitles = [String](parts.keys)
partsSectionTitles.sort() $0 < $1 

这很有效,因为我没有收到任何错误。

【问题讨论】:

您因未发布您尝试过的内容而被否决。我相信你已经尝试了几件事。发布您到目前为止所拥有的内容,我们可以帮助您修复它:) 如果你碰巧什么都没试过,看看 Swift 的全局排序功能。您可以将partsOfNovel.keys 与闭包一起传递给它以进行排序。 Swift 的 Sorted 函数是一种简单的方法,您可以在 Apple 的 Swift's Book 中找到解释。 Closures 是的,我尝试了一些我现在不记得的东西。下次我提出问题时,我会尝试发布我尝试过的内容。否决票是不必要的,但谢谢......我猜。 【参考方案1】:

这应该可以满足您的需要。该数组包含 String 元素。

var partsSectionTitles:[String] = partsOfNovel.allKeys as [String]
var sortedNames = partsSectionTitles.sorted  $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedDescending 

【讨论】:

var partsSectionTitles:[String] = partsOfNovel.allKeys as [String] 无法为我编译。我收到以下错误消息:'[String : Array&lt;String&gt;]' does not have a member named 'allKeys'. 你可以使用NSDictionary(dictionary: partsOfNovel).allKeys进行强制转换,OP的代码有var partsOfNovel = [:] 在 Swift 4 中,使用 ... $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedDescending 【参考方案2】:

对字符串数组进行排序的快速排序函数怎么样? (Source)

首先创建一个数组扩展来分解给定的数组:

extension Array 
  var decompose : (head: T, tail: [T])? 
    return (count > 0) ? (self[0], Array(self[1..<count])) : nil
  

第二次创建快速排序函数,以便您可以对分解后的数组进行排序:

func qsort(input: [String]) -> [String] 
  if let (pivot, rest) = input.decompose 
    let lesser = rest.filter  $0 < pivot 
    let greater = rest.filter  $0 >= pivot 
    return qsort(lesser) + [pivot] + qsort(greater)
   else 
    return []
  

用显式类型(字典和数组)声明变量:

var partsOfNovel = [​String​ : [String]]()
var partsSectionTitles = [String]()

填写:

partsOfNovel = [
  "Part 1" : ["Chapter X:1", "Chapter X:2", "Chapter X:3"],
  "Part 2" : ["Chapter X:1", "Chapter X:2"],
  "Part 3" : ["Chapter X:1"]
]

partsSectionTitles = partsOfNovel.allKeys
// ["Part 1", "Part 3", "Part 2"]

最后订购您的字符串数组:

var orderedSectionTitles = qsort(partsSectionTitles)
// ["Part 1", "Part 2", "Part 3"]

我认为在纯 Swift 中是一个不错的解决方案,希望对您有所帮助!

【讨论】:

partsOfNovel 应声明为 [​String​ : [String]] 类型,而不是 [​String​ : String] 类型。 是的,您可以完全确定,但在这种情况下,编译器会正确推断您正在发送字符串数组。但我同意更好。 您好,感谢您的回答。我只使用了它的一部分,但它起作用了: var partsOfNovel = [String:[String]]() 我还将 partsOfNovel 声明更改为:partsSectionTitles.sort() $0 【参考方案3】:
let array = ["j","d","k","h","m"]
func backward(x : String, y: String) -> Bool

    return x>y


var reverse = sorted(array,backward)


println((reverse))

或者你可以这样写:

var newrev = sorted(array, $0 < $1)

var other = sorted (array , >)

【讨论】:

【参考方案4】:

假设您有以下带有NSDictionaryNSArray 的Objective-C 代码:

NSDictionary *partsOfNovel = @@"Part 1" : @[@"Chapter X:1", @"Chapter X:2", @"Chapter X:3"],
                               @"Part 4" : @[@"Chapter X:1", @"Chapter X:2"],
                               @"Part 3" : @[@"Chapter X:1"];

NSArray *partsSectionTitles = [[partsOfNovel allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSLog(@"%@", partsSectionTitles);

使用此代码,您的控制台将打印:

"Part 1",
"Part 3",
"Part 4"

使用 Swift,您可以获取 Dictionary 的密钥并将它们放入 Array 中,如下所示:

let partsOfNovel = [
    "Part 1" : ["Chapter X:1", "Chapter X:2", "Chapter X:3"],
    "Part 4" : ["Chapter X:1", "Chapter X:2"],
    "Part 3" : ["Chapter X:1"]]

let nonOrderedPartsSectionTitles = partsOfNovel.keys.array

然后您可以对这个Array 应用排序并打印如下结果:

let partsSectionTitles = nonOrderedPartsSectionTitles.sorted  $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending 
println(partsSectionTitles) //[Part 1, Part 3, Part 4]

但是所有这些都可以用 Swift 以一种非常简洁的方式完成(用 Playground 测试):

let partsOfNovel = [
    "Part 1" : ["Chapter X:1", "Chapter X:2", "Chapter X:3"],
    "Part 4" : ["Chapter X:1", "Chapter X:2"],
    "Part 3" : ["Chapter X:1"]]

let partsSectionTitles = partsOfNovel.keys.array.sorted  $0.0 < $1.0 
println(partsSectionTitles) //[Part 1, Part 3, Part 4]

【讨论】:

您好,感谢您的回答。我只使用了其中的一部分,但它起作用了:partsSectionTitles.sort() $0

以上是关于Swift:按字母顺序对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

对带有异常的字符串数组进行排序 Swift

排序数组字母数字Swift3

首先按字母顺序对对象数组进行排序,然后按数字排序

按字母顺序对 c 字符串数组进行排序

按字母顺序对字符串数组进行排序 C++

除数字外,如何按字母顺序对对象数组进行排序?