Die*_*ach 3 arrays multidimensional-array higher-order-functions ios swift
我今天使用循环获得了所需的输出,但是如何使用 map 和 filter 将该循环与单行表达式交换?
我从一系列国家开始。从这个我使用 map 生成带有首字母的第二个数组。我现在想构建一个二维数组,其中包含使用 map 和 filter 在不同数组中具有相同首字母的所有国家,以便我可以摆脱我今天使用的循环。
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
var initials = Set(countries.map { $0.prefix(1) }).sorted()
func countriesByInitial() -> [[String]] {
var result = [[String]]()
for initial in initials {
result.append(countries.filter { $0.prefix(1) == initial })
}
return result
}
Run Code Online (Sandbox Code Playgroud)
您可以通过group > sort > map组合来实现它:
let countries = ["Algeria", "Albania", "Belarus", "Bahamas", "Canada"]
let groupedDict = Dictionary(grouping: countries, by: { $0.prefix(1) })
let sortedDict = groupedDict.sorted(by: { $0.key < $1.key })
let arr2D = sortedDict.map({ $0.value })
Run Code Online (Sandbox Code Playgroud)
您可以将其写在一行中:
let arr = (Dictionary(grouping: countries, by: { $0.prefix(1) })).sorted(by: { $0.key < $1.key }).map({ $0.value })
Run Code Online (Sandbox Code Playgroud)
您也可以在数组上使用 reduce:
// $0 将是类型 [[String]]
// $1 将是类型 String
let arr2D: [[String]] = countries.reduce(into: []) {
let checkChar = $1.first
if let idx = $0.index(where: {$0.first?.first == checkChar }) {
$0[idx].append($1)
} else {
$0.append([$1])
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |