我正在寻找最有效的方法来解决这个问题。假设有一个对象数组,按名称按字母顺序排列:
let objectArray = [AnyObject]()
let abcNameObjectArray = ["Amy", "Bernadette", "Brian", "Chris", "Candice"]
如何访问此数组中包含" A"的所有值? ," B"或" C"基于abcNameObject数组中每个String值的第一个字符,按字母顺序排列?我尝试卸载数据并在UITableView的cellForRowAt方法和numberOfRowsInSection方法中返回特定数量的行,这些方法基于按字母顺序排列的朋友数量。 目标是将数组拆分为数组SET,以填充表视图,如联系人应用程序,并访问给定部分的值。也许利用字典可能更好地解决这个问题?
答案 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
测试。