Swift:按字母顺序排序数组

7

我是一名新手,对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代码?感谢您提前回答。

更新:我能够使用你们提供的答案的一些片段来解决这个问题。所以,谢谢大家!这是我拥有的:

我声明了parts字典为:

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

这让我可以给每个键提供多个值。这对我帮助很大。

接着,我能够创建"partsSectionTitles"并对其进行排序:

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

这个操作成功了,我没有收到任何错误信息。


你因为没有发布你尝试过的内容而被踩了。我相信你已经尝试了很多方法。发布一下你目前的进展,我们可以帮助你改进它 :) - Lance
1
如果你还没有尝试过任何东西,可以看一下Swift的全局Sort函数。你可以将partsOfNovel.keys和一个闭包一起传递给它来进行排序。 - Lance
Swift的Sorted函数是一种简单的方法,你可以在苹果的Swift书中找到解释。闭包。 - David Gomez
是的,我尝试了一些事情,但现在无法记起来。下次我提问时会尽量发布我尝试过的内容。虽然不必要,但还是谢谢你的贡献……我想。 - user4229134
4个回答

11

这应该符合您的需求。该数组包含字符串元素。

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' - Imanou Petit
你可以使用 NSDictionary(dictionary: partsOfNovel).allKeys 进行类型转换,OP 的代码中有 var partsOfNovel = [:] - gabbler
在 Swift 4 中,使用... { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedDescending }。 - robert

5

需要对字符串数组进行排序,可以使用一个漂亮的快速排序函数吗?(来源)

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

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的不错解决方案,希望能对你有所帮助!


1
partsOfNovel 应该声明为类型为 [String: [String]],而不是类型为 [String: String] - Imanou Petit
是的,你可以这样做来确保完全正确,但在这种情况下,编译器正确地推断出你正在发送一个字符串数组。不过我同意这样做更好。 - David Gomez
你好,谢谢你的回答。我只使用了其中的一部分,但它起作用了:var partsOfNovel = [String:[String]]()我还将partsOfNovel声明更改为:partsSectionTitles.sort(){ $0 < $1 }再次感谢! - user4229134

4
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 , >)

1

假设您有以下带有 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

你可以对这个数组进行排序,然后像这样打印结果:
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 < $1 }我还将partsOfNovel声明更改为:var partsOfNovel = [String:[String]]()再次感谢! - user4229134

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接