Arrays Ruby:比较数组并根据特定条件创建新数组
我有3个长度相等的数组。有些点是零,这使事情复杂化,但我需要保持它们的顺序Arrays Ruby:比较数组并根据特定条件创建新数组,arrays,ruby,Arrays,Ruby,我有3个长度相等的数组。有些点是零,这使事情复杂化,但我需要保持它们的顺序 a = [5.2, 3.0, 1.21, 7.0, 5.0, 5.0, 6.0, 8.0, 10.0, 10.0] b = [nil, nil, [{"price"=>1.99, "size"=>269.897475661239}], nil, nil, nil, nil, nil, nil, nil] x = [6.0, 6.2, 2.5, 5.0, 9.0, 2.36, 15.5, 20.0, nil,
a = [5.2, 3.0, 1.21, 7.0, 5.0, 5.0, 6.0, 8.0, 10.0, 10.0]
b = [nil, nil, [{"price"=>1.99, "size"=>269.897475661239}], nil, nil, nil, nil, nil, nil, nil]
x = [6.0, 6.2, 2.5, 5.0, 9.0, 2.36, 15.5, 20.0, nil, nil]
(第一步,我想迭代b,这样b=[nil,nil,1.99,nil,nil,nil,nil,nil,nil,nil]
。只需要[“price”],忽略[“size”]就可以了。我想不出来。)
第二步,我想创建一个新数组(c
),它平均a
和b
,但如果为零,就取一个有值的数组。换句话说,c
将=[5.2,3.0,1.6,7.0,5.0,5.0,6.0,8.0,10.0,10.0]
看起来像a
,除了第三点的平均值为1.21和1.99(1.6)
所以我有了我原来的第三个数组x=[6.0,6.2,2.5,5.0,9.0,2.36,15.5,20.0,nil,nil]
第三步,我想比较c
和x
,并创建一个新数组z
,该数组取两个数字中较小的*,如果为nil,则取有值的一个z
是我想要的结果
因此z
应该=[6.0,6.2,2.5,7.0,9.0,5.0,15.5,20.0,10.0,10.0]
(如果我的眼睛是正确的)。(*编辑:我指的是两个数字中的较大者,这就是为什么这个数组与下面的答案不匹配,所以我使用下面的答案,但使用了.max
而不是.min
)
我知道这些步骤很枯燥,但我需要按顺序进行,因为我有很多数组,我需要取2的平均值,然后与第三个数组进行比较,取较大的数字,并在整个数组中加入随机的nil值,这超出了我的能力。我想不出来,非常感谢您的帮助!谢谢大家!
bb = b.map { |e| e.is_a?(Array) ? e.first["price"] : e }
#=> [nil, nil, 1.99, nil, nil, nil, nil, nil, nil, nil]
c = a.zip(bb).map { |ea, ebb| ebb.nil? ? ea : (ea+ebb)/2.0 }
#=> [5.2, 3.0, 1.6, 7.0, 5.0, 5.0, 6.0, 8.0, 10.0, 10.0]
c.zip(x).map { |cc,xx| xx.nil? ? cc : [cc,xx].min }
#=> [5.2, 3.0, 1.6, 5.0, 5.0, 2.36, 6.0, 8.0, 10.0, 10.0]
如果只需要bb
和返回值,则可以执行以下计算
[a,bb,x].transpose.map do |ae,bbe,xe|
ab_avg = bbe ? (ae+bbe)/2.0 : ae
xe ? [ab_avg, xe].min : ab_avg
end
#=> [5.2, 3.0, 1.6, 5.0, 5.0, 2.36, 6.0, 8.0, 10.0, 10.0]
如果只需要bb
和返回值,则可以执行以下计算
[a,bb,x].transpose.map do |ae,bbe,xe|
ab_avg = bbe ? (ae+bbe)/2.0 : ae
xe ? [ab_avg, xe].min : ab_avg
end
#=> [5.2, 3.0, 1.6, 5.0, 5.0, 2.36, 6.0, 8.0, 10.0, 10.0]
第1步。
b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }
第2步。
b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }
第3步。
b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }
第1步。
b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }
第2步。
b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }
第3步。
b.map!{ |x| x.first.values.first if x }
c = a.map.each_with_index{ |x, i| (x && b[i]) ? ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }
c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i]) }
1.
a
、b
和x
的长度是否始终相同?2.a
是否可以包含任何nil
元素?3.考虑到“第三步”阵列可以在不首先构造其他两个阵列的情况下构造,您希望通过“第一步”和“第二步”生成阵列,还是仅通过“第三步”生成阵列。b
是否可以包含整数以及nil
和包含散列的数组?1。是的。我不这么认为,它来自一个json,我仍在探索,还没有遇到任何json。3.tbh,我真的只需要第三步,所以谢谢你下面的回答!4.b将仅包含nil
或包含显示的哈希的数组。很好的后续问题,谢谢你下面的精彩回答!1.a
、b
和x
的长度是否始终相同?2.a
是否可以包含任何nil
元素?3.考虑到“第三步”阵列可以在不首先构造其他两个阵列的情况下构造,您希望通过“第一步”和“第二步”生成阵列,还是仅通过“第三步”生成阵列。b
是否可以包含整数以及nil
和包含散列的数组?1。是的。我不这么认为,它来自一个json,我仍在探索,还没有遇到任何json。3.tbh,我真的只需要第三步,所以谢谢你下面的回答!4.b将仅包含nil
或包含显示的哈希的数组。很好的后续问题,谢谢你下面的精彩回答!我更愿意执行步骤1,然后在步骤3中得到结果,因此您是否会提醒我使用bb
而不是b
重新编写第二个代码?非常感谢。我做了你要求的更改。谢谢你,这很好用!如果你不介意的话,我还有一个标准要补充!我想你不到一分钟就能解决它。我将不胜感激。请随意在上面或要点中添加答案。我自己尝试过,虽然不漂亮,但完成了工作b.each.with_index{e,i | if e.nil?&x[i].nil?;b.delete_at(i);p.delete_at(i);a.delete_at(i);x.delete_at(i);end}
会在转置
和映射
之间插入{reject{ae ae abe,xe ae nil?&xe nil},以实现您的目标?我希望在第1步,然后在第3步中得到结果,因此,您是否会提醒您使用bb
而不是b
重新编写第二个代码?非常感谢。我做了你要求的更改。谢谢你,这很好用!如果你不介意的话,我还有一个标准要补充!我想你不到一分钟就能解决它。我将不胜感激。请随意在上面或要点中添加答案。我自己尝试过,虽然不漂亮,但完成了工作b.each.with_index{e,i|if e.nil?&x[i].nil?;b.delete_at(i);p.delete_at(i);a.delete_at(i);x.delete_at(i);end}
在transpose
和map
之间插入`拒绝{ae ae,bbe,xe,xe | ae.nil?&xe}可以实现你的目标吗?