数组在红宝石中总和

时间:2013-04-26 23:25:51

标签: ruby arrays multidimensional-array

arry = [["a",3.0,3], ["b",4.0,4], ["c",5.0,5]]

我正在寻找以下输出

[["a", 3.0, [["b", 4.0, 7], ["c", 5.0, 8]]],
 ["b", 4.0, [["a", 3.0, 7], ["c", 5.0, 9]]],
 ["c", 5.0, [["a", 3.0, 8], ["b", 4.0, 9]]]]

这就是我所做的

  • 使用数组的大小,我遍历循环
  • 首先,我采取了第一个要素。
  • 删除它并创建一个新数组。我迭代了 通过新数组,计算总和并将元素推送到 new array2
  • 我在末尾添加了删除的元素

我无法生成以下上述输出格式。我能做的输出是

[a,3.0,b,4.0,7]
7 here is 3+4
[a,3.0,c,5.0,8]
[b,4.0,c,5.0,9]
..etc

除此之外,如何编码显示只允许说小于8的元素

并获得此输出

[["a",3.0,["b",4.0,7]],["b",4.0,["a",5.0,7]],["c",5.0,[]]

1 个答案:

答案 0 :(得分:1)

arry.map do |inner|
  dup = inner.dup
  n = dup[2]
  dup[2] = []

  arry.each do |other|
    next if other == inner # Only want other inner arrays
    other_dup = other.dup
    other_dup[2] += n
    dup[2] << other_dup
  end

  dup
end

评估结果为:

[["a", 3.0, [["b", 4.0, 7], ["c", 5.0, 8]]],
 ["b", 4.0, [["a", 3.0, 7], ["c", 5.0, 9]]],
 ["c", 5.0, [["a", 3.0, 8], ["b", 4.0, 9]]]]

更新:很高兴这就是你想要的。这很难看,但我认为它符合您的过滤目标:

mapped.map do |inner|
  inner_dup = inner.dup

  inner_dup[2] = inner_dup[2].select do |inner_inner|
    inner_inner[2] < 8  # Condition for the elements you want to test
  end

  inner_dup
end

评估结果为:

[["a", 3.0, [["b", 4.0, 7]]], ["b", 4.0, [["a", 3.0, 7]]], ["c", 5.0, []]]

再次注意,这与您指定的输出略有不同,但我相信这是您真正想要的。 (如果每个组匹配多个内部数组怎么办?)