Ruby:根据特定条件比较数组并创建新数组

时间:2016-11-14 03:04:58

标签: 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, nil]

第一步,我想迭代b以便b = [nil, nil, 1.99, nil, nil, nil, nil, nil, nil, nil]。只需要[“price”],忽略[“size”]。无法弄明白。 )

第二步,我想创建一个平均ca的新数组(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]第三步,我想比较cx并创建一个新数组z,它接受​​两个数字的SMALLER *,或者如果为nil,有价值的那个。 z是我想要的结果。

因此z= [6.0, 6.2, 2.5, 7.0, 9.0, 5.0, 15.5, 20.0, 10.0, 10.0](如果我的眼睛是正确的话)。 ( *编辑:我的意思是两个数字中较大的一个,这就是为什么这个数组与下面的答案不匹配,所以我在下面使用了这个答案,但使用.max而不是{{1 }})

我知道这些步骤很乏味,但我需要按顺序进行,因为我有很多数组,我需要平均2然后与第三个进行比较,并采用更大的数字和随机的nil值,它得到超出我的能力。无法弄清楚,并会非常感谢一些帮助!谢谢!

2 个答案:

答案 0 :(得分:6)

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]

答案 1 :(得分:2)

第1步。

b.map!{ |x| x.first.values.first if x }

第2步。

c = a.map.each_with_index{ |x, i| (x && b[i]) ?  ((x || 0) + (b[i] || 0))/2 : (x || b[i]) }

第3步。

c.map.each_with_index{ |k, i| (k && x[i]) ? [k, x[i]].max : (k || x[i])  }