在Swift中以开始字符将数组拆分为多维数组?

He *_*何一非 1 arrays multidimensional-array swift

例如,我想要数组

["ABC", "ADE", "BCD", "HYD", "ZYX", "ZZZ"]
Run Code Online (Sandbox Code Playgroud)

转换为:

[
    ["ABC", "ADE"],
    ["BCD"],
    ["HYD"],
    ["ZYX", "ZZZ"],
]
Run Code Online (Sandbox Code Playgroud)

那么我该如何实现呢?谢谢!

vac*_*ama 5

使用您的数组创建一个中间字典,该字典将初始字母映射到以该字母开头的字符串数组,然后从字典中创建最终数组:

使用 Dictionary(grouping:by)

现在可以使用Dictionary(grouping:by:)以下命令创建字典:

let arr = ["ABC", "ADE", "BCD", "HYD", "ZYX", "ZZZ"]

let dict = Dictionary(grouping: arr, by: { $0.prefix(1) })
print(dict)
Run Code Online (Sandbox Code Playgroud)
["H": ["HYD"], "A": ["ABC", "ADE"], "B": ["BCD"], "Z": ["ZYX", "ZZZ"]]
Run Code Online (Sandbox Code Playgroud)
let arr2 = dict.keys.sorted().compactMap { dict[$0] }
print(arr2)
Run Code Online (Sandbox Code Playgroud)
[["ABC", "ADE"], ["BCD"], ["HYD"], ["ZYX", "ZZZ"]]
Run Code Online (Sandbox Code Playgroud)

注意:我使用.prefix(1)代替,.first!因为prefix(1)如果原始数组包含一个空字符串不会崩溃""


原始答案:

let arr = ["ABC", "ADE", "BCD", "HYD", "ZYX", "ZZZ"]

var dict = [Character : [String]]()

for str in arr {
    if let first = str.first {
        dict[first, default: []] += [str]
    }
}

print(dict)
Run Code Online (Sandbox Code Playgroud)
["A": ["ABC", "ADE"], "H": ["HYD"], "B": ["BCD"], "Z": ["ZYX", "ZZZ"]]
Run Code Online (Sandbox Code Playgroud)
let arr2 = dict.keys.sorted().map { dict[$0]! }
print(arr2)
Run Code Online (Sandbox Code Playgroud)
[["ABC", "ADE"], ["BCD"], ["HYD"], ["ZYX", "ZZZ"]]
Run Code Online (Sandbox Code Playgroud)