2017-07-06 31 views
-1

我正在寻找最有效的方法来解决这个问题。说有对象的数组,由名字的字母顺序编制:拆分和排序字符串数组swift 3

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

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

+1

[按字母顺序在swift中对数组排序](https:// stackoverflow。com/questions/36394813 /按数组排序的字母顺序排列) –

+0

如果它已经排序,那么你想要做什么?为什么不迭代数组并创建一个字典数组,并将键作为“A”并将其作为成员数组赋值?这里没有什么可以排序的。只需按照您找到的顺序向字典内的数组添加元素即可。 – adev

+0

您需要根据您的输入提供期望的结果来编辑您的问题。目前还不清楚你期望的是什么。 – rmaddy

回答

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) 

输出:

[ “一”, “B”, “C”]

[ “B”:[ “贝尔纳黛特”, “布赖恩”], “一个” :[ “艾米”], “C”:[ “康迪斯”, “克里斯”]]

解决方案2:

这里是1米使用数组的数组矿石溶液通过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) 

输出的建议:

[[ “艾美”],[ “贝尔纳黛特”, “布赖恩”],[ “克里斯”, “康迪斯” ]]

您可以将节数设置为此数组的计数,并且每个成员将给出该节中所需的单元数。

+0

对不起,我一直没有回应,但我认为你的解决方案是最好的,所以我打算把它作为答案。但是,有没有办法修改输出以返回一个Object数组,而不是一个String数组? –

+0

感谢您的接受。是的,你可以返回任何东西。这只是一个例子。您可以修改如上所示的reduce方法,并使其返回对象数组。请随时尝试一下,然后问问你是否无法做到这一点。我们能帮你。 – adev

0

A Set对于表视图的数据源不是一个好的选择。 A 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测试。