给定两个包含不同容量数组的字典,将元素添加到填充较少的数组
Given two dictionaries containing arrays of different capacities add elements to the lesser populated array
鉴于此数据
var data =
["groupA":
[1, 2, 3, 4, 5, 6],
"groupB":
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
我想要这个输出:
["groupA":
[0, 0, 0, 0, 1, 2, 3, 4, 5, 6],
"groupB":
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
这是我能想到的最好的答案,但我觉得它缺少它,因为我可以访问我想在 reduce 函数中改变的累加器。
let maxElement = data.reduce(data.first!) { (acc, obj) in
return acc.value.count > obj.value.count ? acc : obj
}
for dict in data {
if dict.value.count < maxElement.value.count {
var mutableValues = dict.value
mutableValues.insert(0, at: 0)
data[dict.key] = mutableValues
}
}
我想我不明白如何最好地重构我的 reduce 函数。
您可以获得数组的最大计数并创建一个零数组,并将差值附加到较少填充的数组,如下所示:
var dict: [String:[Int]] = ["groupA": [1, 2, 3, 4, 5, 6],
"groupB": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
let maxCount = dict.values.map{ [=10=].count }.max() ?? 0
for (key, value) in dict {
let difference = maxCount - value.count
if difference > 0 {
dict[key] = repeatElement(0, count: difference) + value
}
}
print(dict) // ["groupB": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "groupA": [0, 0, 0, 0, 1, 2, 3, 4, 5, 6]]
如果你像我一样不喜欢 for 循环,这个怎么样:
data.reduce(data.values.reduce(0){max([=10=],.count)})
{ data[.0] = Array(repeating:0,count:[=10=]-.1.count) + .1; return [=10=]}
根据您的问题,您需要重构 reduce 函数的代码,我按照以下方式进行了。
希望这对您有所帮助,
let maxElement = data.reduce(data.first!) {
[=10=].value.count > .value.count ? [=10=] :
}
我进一步修改了您提供的代码以实现您尝试的结果。
代码对我来说效果很好。
let maxElement = data.reduce(data.first!) {
[=11=].value.count > .value.count ? [=11=] :
}
let minElement = data.reduce(data.first!) {
[=11=].value.count < .value.count ? [=11=] :
}
for dict in data {
if dict.value.count < maxElement.value.count {
var mutableValues = minElement.value
let arrayOfZeros = Array(repeating: 0, count: maxElement.value.count - minElement.value.count)
mutableValues.insert(contentsOf: arrayOfZeros, at: 0)
data[dict.key] = mutableValues
}
}
鉴于此数据
var data =
["groupA":
[1, 2, 3, 4, 5, 6],
"groupB":
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
我想要这个输出:
["groupA":
[0, 0, 0, 0, 1, 2, 3, 4, 5, 6],
"groupB":
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
这是我能想到的最好的答案,但我觉得它缺少它,因为我可以访问我想在 reduce 函数中改变的累加器。
let maxElement = data.reduce(data.first!) { (acc, obj) in
return acc.value.count > obj.value.count ? acc : obj
}
for dict in data {
if dict.value.count < maxElement.value.count {
var mutableValues = dict.value
mutableValues.insert(0, at: 0)
data[dict.key] = mutableValues
}
}
我想我不明白如何最好地重构我的 reduce 函数。
您可以获得数组的最大计数并创建一个零数组,并将差值附加到较少填充的数组,如下所示:
var dict: [String:[Int]] = ["groupA": [1, 2, 3, 4, 5, 6],
"groupB": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
let maxCount = dict.values.map{ [=10=].count }.max() ?? 0
for (key, value) in dict {
let difference = maxCount - value.count
if difference > 0 {
dict[key] = repeatElement(0, count: difference) + value
}
}
print(dict) // ["groupB": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "groupA": [0, 0, 0, 0, 1, 2, 3, 4, 5, 6]]
如果你像我一样不喜欢 for 循环,这个怎么样:
data.reduce(data.values.reduce(0){max([=10=],.count)})
{ data[.0] = Array(repeating:0,count:[=10=]-.1.count) + .1; return [=10=]}
根据您的问题,您需要重构 reduce 函数的代码,我按照以下方式进行了。
希望这对您有所帮助,
let maxElement = data.reduce(data.first!) {
[=10=].value.count > .value.count ? [=10=] :
}
我进一步修改了您提供的代码以实现您尝试的结果。
代码对我来说效果很好。
let maxElement = data.reduce(data.first!) {
[=11=].value.count > .value.count ? [=11=] :
}
let minElement = data.reduce(data.first!) {
[=11=].value.count < .value.count ? [=11=] :
}
for dict in data {
if dict.value.count < maxElement.value.count {
var mutableValues = minElement.value
let arrayOfZeros = Array(repeating: 0, count: maxElement.value.count - minElement.value.count)
mutableValues.insert(contentsOf: arrayOfZeros, at: 0)
data[dict.key] = mutableValues
}
}