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

Swift 给定两个包含不同容量数组的字典,将元素添加到填充较少的数组中,swift,dictionary,functional-programming,immutability,reduce,Swift,Dictionary,Functional Programming,Immutability,Reduce,所以根据这些数据 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]] 这是我能想到的最好的答案,但我觉得

所以根据这些数据

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
  }
}
让maxElement=data.reduce(data.first!){(acc,obj)在
返回acc.value.count>obj.value.count?acc:obj
}
数据中的dict{
如果dict.value.count

我想我不明白如何最好地重构我的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
  }
}
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{ $0.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]]

您可以获得数组的最大计数,并创建一个零数组,其差值将附加到填充较少的数组中,如下所示:

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{ $0.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($0,$1.count)})
{ data[$1.0] = Array(repeating:0,count:$0-$1.1.count) + $1.1; return $0} 

如果,像我一样,你不喜欢for循环,那么这个怎么样:

data.reduce(data.values.reduce(0){max($0,$1.count)})
{ data[$1.0] = Array(repeating:0,count:$0-$1.1.count) + $1.1; return $0} 

根据您的问题,您需要为reduce函数重构代码,我按照以下方法进行了操作

希望这有帮助

let maxElement = data.reduce(data.first!) {
    $0.value.count > $1.value.count ? $0 : $1
}
此外,我还修改了您提供的代码,以实现您尝试的结果

代码对我来说很有效

let maxElement = data.reduce(data.first!) {
    $0.value.count > $1.value.count ? $0 : $1
}

let minElement = data.reduce(data.first!) {
    $0.value.count < $1.value.count ? $0 : $1
}

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
    }
}
让maxElement=data.reduce(data.first!){
$0.value.count>$1.value.count?$0:$1
}
让minElement=data.reduce(data.first!){
$0.value.count<$1.value.count?$0:$1
}
数据中的dict{
如果dict.value.count
根据您的问题,您需要为reduce函数重构代码,我按照以下方法进行了操作

希望这有帮助

let maxElement = data.reduce(data.first!) {
    $0.value.count > $1.value.count ? $0 : $1
}
此外,我还修改了您提供的代码,以实现您尝试的结果

代码对我来说很有效

let maxElement = data.reduce(data.first!) {
    $0.value.count > $1.value.count ? $0 : $1
}

let minElement = data.reduce(data.first!) {
    $0.value.count < $1.value.count ? $0 : $1
}

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
    }
}
让maxElement=data.reduce(data.first!){
$0.value.count>$1.value.count?$0:$1
}
让minElement=data.reduce(data.first!){
$0.value.count<$1.value.count?$0:$1
}
数据中的dict{
如果dict.value.count
您也可以说
let maxCount=data.values.map{$0.count}.max()??最大计数为0。我也会使用
来。。。在这里的
循环中,就像您在dict{…}
中为(键、值)所做的那样。您还可以对前缀为零的字符说
repeatElement(0,count:difference)
,这样可以节省分配临时数组缓冲区的时间。@Hamish您认为对计数使用map比我现在使用的语法快吗?
map(:)
应用于
dict.values
这是一个惰性集合,因此,映射是惰性地评估的——因此实际上不应该有任何性能差异(至少没有创建临时数组)。我只是为了一个稍微好一点的语法才建议使用它。你也可以说
let maxCount=data.values.map{$0.count}.max()??最大计数为0。我也会使用
来。。。在这里的
循环中,就像您在dict{…}
中为(键、值)所做的那样。您还可以对前缀为零的字符说
repeatElement(0,count:difference)
,这样可以节省分配临时数组缓冲区的时间。@Hamish您认为对计数使用map比我现在使用的语法快吗?
map(:)
应用于
dict.values
这是一个惰性集合,因此,映射是惰性地评估的——因此实际上不应该有任何性能差异(至少没有创建临时数组)。我只是为了更好的语法才这么建议的。哎呀,就是这样。谢谢那正是我要找的。哎呀,在那里。谢谢这正是我想要的。