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<String>]' 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】:假设您有以下带有NSDictionary
和NSArray
的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:按字母顺序对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章