【问题标题】:Swift: Sort Array in Alphabetical OrderSwift:按字母顺序对数组进行排序
【发布时间】: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
  • 是的,我尝试了一些我现在不记得的东西。下次我提出问题时,我会尝试发布我尝试过的内容。否决票是不必要的,但谢谢......我猜。

标签: ios arrays sorting swift nsdictionary


【解决方案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
    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2010-12-12
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多