gpt4 book ai didi

swift - 将数组分组以匹配另一个数组

转载 作者:搜寻专家 更新时间:2023-10-31 23:05:57 31 4
gpt4 key购买 nike

我有一组按月分组的日期。我正在尝试对另一个值数组进行分组,以便它与第一个数组匹配。这可能吗?

例如:

array1 = [[1,2,3],[4,5,6]]
array2 = ["one","two","three","four","five","six"]

我希望第二个数组与第一个数组分组相同,以便它们匹配:

array2 = [["one","two","three"],["four","five","six"]]

最佳答案

一个想法的演变......

首先是一个二维数组的解决方案:

如果你知道你的 array1是一个二维数组(元素数组的数组),你可以通过制作array2来做到这一点进入迭代器并使用 mapcompactMap替换元素:

let array1 = [[1,2,3],[4,5,6]]
let array2 = ["one","two","three","four","five","six"]

var iter = array2.makeIterator()

let array3 = array1.map { arr in arr.compactMap { _ in iter.next() }}
print(array3)

结果:

[["one", "two", "three"], ["four", "five", "six"]]

更通用和通用的解决方案:

这是一个更通用的解决方案,它使用序列而不是 array2 ,这并不取决于您提前了解 array1 的布局或数组或序列的值的类型:

func remap<S: Sequence>(_ array: [Any], using sequence: S) -> [Any] {
var iter = sequence.makeIterator()

func remap(_ array: [Any]) -> [Any] {
return array.compactMap { value in
if let subarray = value as? [Any] {
return remap(subarray)
} else {
return iter.next()
}
}
}

return remap(array)
}

这是如何工作的:

第二个数组或序列被转换为一个名为 iter 的迭代器这允许我们通过重复调用 iter.next() 来按顺序获取值.

然后是 remap() 的第二个递归版本用于转换[Any]进入[Any]按照深度优先的遍历顺序。 compactMap()用于替换数组的元素。替换数组元素时,如果元素是另一个数组,则递归调用remap()在那个数组上,直到它最终得到不是数组的值。如果该元素是非数组元素,则将其替换为 next来自迭代器的值,它按顺序提供序列(或第二个数组)的元素。我们使用 compactMap而不是 map处理 iter.next() 的事实正在返回 可选 值,因为它可能会用完值,在这种情况下它会返回 nil .在这种情况下,remap()将用空替换剩余的元素,同时仍然保持第一个嵌套数组的结构。

示例:

// replace Ints with Strings
let array1: [Any] = [1, [2, 3], [4, [5, 6]]]
let array2 = ["one","two","three","four","five","six"]

let array3 = remap(array1, using: array2)
print(array3)
["one", ["two", "three"], ["four", ["five", "six"]]]
// replace Strings with Ints
let array4: [Any] = ["a", ["b", "c"], [[["d"]], "e"]]
let array5 = [1, 2, 3, 4, 5]

let array6 = remap(array4, using: array5)
print(array6)
[1, [2, 3], [[[4]], 5]]
// map letters to numbers starting with 5 using a partial range
print(remap(["a", ["b"], ["c", ["d"]]], using: 5...))
[5, [6], [7, [8]]]
// using stride to create a sequence of even numbers
let evens = stride(from: 2, to: Int.max, by: 2)
print(remap([["a", "b"], ["c"], [["d"]]], using: evens))
[[2, 4], [6], [[8]]]
// an example of not enough values in replacement array
print(remap([["a", "b"], ["c"], [["d"]]], using: [1]))
[[1], [], [[]]]

关于swift - 将数组分组以匹配另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962241/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com