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
这是一个惰性集合,因此,映射是惰性地评估的——因此实际上不应该有任何性能差异(至少没有创建临时数组)。我只是为了更好的语法才这么建议的。哎呀,就是这样。谢谢那正是我要找的。哎呀,在那里。谢谢这正是我想要的。