如何使用映射和过滤器从一维数组生成二维数组?
How to generate a 2D-array from a 1D-array using map and filter?
我今天使用循环获得了所需的输出,但如何使用映射和过滤器将此循环与单行表达式交换?
我从一系列国家开始。从这个我使用地图生成第二个带有初始字母的数组。我现在想使用 map 和 filter 在单独的数组中构建一个包含所有具有相同首字母的国家/地区的二维数组,这样我就可以摆脱我今天使用的循环。
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
var initials = Set(countries.map { [=10=].prefix(1) }).sorted()
func countriesByInitial() -> [[String]] {
var result = [[String]]()
for initial in initials {
result.append(countries.filter { [=10=].prefix(1) == initial })
}
return result
}
你可以通过 group > sort > map 组合实现:
let countries = ["Algeria", "Albania", "Belarus", "Bahamas", "Canada"]
let groupedDict = Dictionary(grouping: countries, by: { [=10=].prefix(1) })
let sortedDict = groupedDict.sorted(by: { [=10=].key < .key })
let arr2D = sortedDict.map({ [=10=].value })
你可以写成一行:
let arr = (Dictionary(grouping: countries, by: { [=11=].prefix(1) })).sorted(by: { [=11=].key < .key }).map({ [=11=].value })
您也可以对数组使用 reduce:
// $0 的类型为 [[String]]
// $1 的类型为 String
let arr2D: [[String]] = countries.reduce(into: []) {
let checkChar = .first
if let idx = [=12=].index(where: {[=12=].first?.first == checkChar }) {
[=12=][idx].append()
} else {
[=12=].append([])
}
}
如果你的数组已经排序,你可以使用Swift 4方法reduce(into:)
,否则你只需要在分组之前对它进行排序:
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
let grouped: [[String]] = countries.reduce(into: []) {
if [=10=].last?.last?.prefix(1) == .prefix(1) {
[=10=][[=10=].index(before: [=10=].endIndex)].append()
} else {
[=10=].append([])
}
}
print(grouped) // [["Albania", "Algeria", "Angola"], ["Bahamas", "Bahrain"], ["Canada"]]\n"
您可以 map initial
由 filtering countries
字符串首字母设置为:
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
var initials = Set(countries.map { [=10=].prefix(1) }).sorted()
let array = initials.map { letter -> [String] in
return countries.filter { [=10=].prefix(1) == letter }
}
因此,array
是字符串数组([[String]]
)的数组,如:
[["Albania", "Algeria", "Angola"], ["Bahamas", "Bahrain"], ["Canada"]]
我今天使用循环获得了所需的输出,但如何使用映射和过滤器将此循环与单行表达式交换?
我从一系列国家开始。从这个我使用地图生成第二个带有初始字母的数组。我现在想使用 map 和 filter 在单独的数组中构建一个包含所有具有相同首字母的国家/地区的二维数组,这样我就可以摆脱我今天使用的循环。
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
var initials = Set(countries.map { [=10=].prefix(1) }).sorted()
func countriesByInitial() -> [[String]] {
var result = [[String]]()
for initial in initials {
result.append(countries.filter { [=10=].prefix(1) == initial })
}
return result
}
你可以通过 group > sort > map 组合实现:
let countries = ["Algeria", "Albania", "Belarus", "Bahamas", "Canada"]
let groupedDict = Dictionary(grouping: countries, by: { [=10=].prefix(1) })
let sortedDict = groupedDict.sorted(by: { [=10=].key < .key })
let arr2D = sortedDict.map({ [=10=].value })
你可以写成一行:
let arr = (Dictionary(grouping: countries, by: { [=11=].prefix(1) })).sorted(by: { [=11=].key < .key }).map({ [=11=].value })
您也可以对数组使用 reduce:
// $0 的类型为 [[String]]
// $1 的类型为 String
let arr2D: [[String]] = countries.reduce(into: []) {
let checkChar = .first
if let idx = [=12=].index(where: {[=12=].first?.first == checkChar }) {
[=12=][idx].append()
} else {
[=12=].append([])
}
}
如果你的数组已经排序,你可以使用Swift 4方法reduce(into:)
,否则你只需要在分组之前对它进行排序:
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
let grouped: [[String]] = countries.reduce(into: []) {
if [=10=].last?.last?.prefix(1) == .prefix(1) {
[=10=][[=10=].index(before: [=10=].endIndex)].append()
} else {
[=10=].append([])
}
}
print(grouped) // [["Albania", "Algeria", "Angola"], ["Bahamas", "Bahrain"], ["Canada"]]\n"
您可以 map initial
由 filtering countries
字符串首字母设置为:
let countries = ["Albania", "Algeria", "Angola", "Bahamas", "Bahrain", "Canada"]
var initials = Set(countries.map { [=10=].prefix(1) }).sorted()
let array = initials.map { letter -> [String] in
return countries.filter { [=10=].prefix(1) == letter }
}
因此,array
是字符串数组([[String]]
)的数组,如:
[["Albania", "Algeria", "Angola"], ["Bahamas", "Bahrain"], ["Canada"]]