Swift:按字母顺序排序数组

时间:2014-11-08 02:04:22

标签: ios arrays sorting swift nsdictionary

我是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 }

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

4 个答案:

答案 0 :(得分:10)

这应该符合您的需要。该数组包含String元素。

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

答案 1 :(得分:5)

一个很好的Quicksort函数来命令你的字符串数组怎么样? (Source

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

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

其次创建Quicksort函数,以便您可以订购分解的数组:

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

使用显式类型(Dictionary和Array)声明变量:

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

最后订购你的Strings Array:

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

我认为纯粹的 Swift 是一个很好的解决方案,我希望它有所帮助!

答案 2 :(得分: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 , >)

答案 3 :(得分: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

然后,您可以对此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]