给定两个包含不同容量数组的字典,将元素添加到填充较少的数组

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
    }
}