拆分和排序字符串数组swift 3

时间:2017-07-06 21:56:21

标签: arrays swift sorting

我正在寻找最有效的方法来解决这个问题。假设有一个对象数组,按名称按字母顺序排列:

let objectArray = [AnyObject]()
let abcNameObjectArray = ["Amy", "Bernadette", "Brian", "Chris", "Candice"]

如何访问此数组中包含" A"的所有值? ," B"或" C"基于abcNameObject数组中每个String值的第一个字符,按字母顺序排列?我尝试卸载数据并在UITableView的cellForRowAt方法和numberOfRowsInSection方法中返回特定数量的行,这些方法基于按字母顺序排列的朋友数量。 目标是将数组拆分为数组SET,以填充表视图,如联系人应用程序,并访问给定部分的值。也许利用字典可能更好地解决这个问题?

2 个答案:

答案 0 :(得分:1)

解决方案1:

将我的评论作为答案用代码发布。检查这是否适合您。您可以使用下面打印的第一个数组(将dict.keys.sorted()存储到某个数组中)中的部分,并将其用作显示该部分中单元格的键。

let abcNameObjectArray = ["Amy", "Bernadette", "Brian", "Chris", "Candice", ""]

let dict = abcNameObjectArray.reduce([String: [String]]()) { (key, value) -> [String: [String]] in
    var key = key
    if let first = value.characters.first {
        let prefix = String(describing: first).lowercased()
        var array = key[prefix]

        if array == nil {
            array = []
        }
        array!.append(value)
        key[prefix] = array!.sorted()
    }
    return key
}

print(dict.keys.sorted())
print(dict)

输出:

  

[“a”,“b”,“c”]

     

[“b”:[“Bernadette”,“Brian”],“a”:[“Amy”],“c”:[“Candice”,“Chris”]]

解决方案2:

这是使用rmaddy

建议的使用数组数组的另一个解决方案
let abcNameObjectArray = ["Amy", "Bernadette", "Brian", "Chris", "Candice", ""]
let unicodeScalarA = UnicodeScalar("a")!

var arrayOfArrays = abcNameObjectArray.reduce([[String]]()) { (output, value) -> [[String]] in
    var output = output

    if output.count < 26 {
        output = (1..<27).map{ _ in return []}
    }

    if let first = value.characters.first {
        let prefix = String(describing: first).lowercased()
        let prefixIndex = Int(UnicodeScalar(prefix)!.value - unicodeScalarA.value)
        var array = output[prefixIndex]
        array.append(value)
        output[prefixIndex] = array.sorted()
    }
    return output
}

arrayOfArrays = arrayOfArrays.filter { $0.count > 0}
print(arrayOfArrays)

输出:

  

[[“Amy”],[“Bernadette”,“Brian”],[“Chris”,“Candice”]]

您可以将多个部分作为此数组的计数,每个成员将提供该部分所需的单元格数。

答案 1 :(得分:0)

对于表视图的数据源,Set不是一个好的选择。 Dictionary也不是一个好选择。两者都是无序集合,表格视图的数据源需要明确的顺序。我建议将源数组分成一个数组数组,其中每个子数组包含以特定字母开头的所有单词,按字母顺序排序。代码可能如下所示:

import UIKit

let strings = ["arf",
               "woofing",
               "flounder",
               "Manbaby",
               "Dogs",
               "baseballs",
               "Suet",
               "Cards",
               "Tiny-fingered, cheeto-faced, ferret-wearing sh*tgibbon",
               "apple",
               "Acorn",
               "Achy-breaky heart",
               "songbirds",
               "Aces"]

let aValue = "a".unicodeScalars.first!.value
let zValue = "z".unicodeScalars.first!.value


var result = [[String]]()
for value in aValue...zValue {
  let aChar = Character(UnicodeScalar(value)!)
  let thisArray = strings
    .filter{$0.lowercased().characters.first! == aChar}
    .sorted{$0.caseInsensitiveCompare($1) == .orderedAscending}
  if !thisArray.isEmpty {
    result.append(thisArray)
  }
}

result.forEach{print($0)}

产生以下输出:

["Aces", "Achy-breaky heart", "Acorn", "apple", "arf"]
["baseballs"]
["Cards"]
["Dogs"]
["flounder"]
["Manbaby"]
["songbirds", "Suet"]
["Tiny-fingered, cheeto-faced, ferret-wearing sh*tgibbon"]
["woofing"]

如果你想要一个包含每个字母条目的数组,即使没有以该字母开头的单词,也要去除if !thisArray.isEmpty测试。