如何使用映射和过滤器从一维数组生成二维数组?

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 initialfiltering 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"]]