2013-04-26 222 views
0
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]]]] 

这是我做了什么

  • 随着数组的大小,我遍历循环
  • 首先,我已经采取了第一个要素。
  • 删除它并创建一个新的数组。我迭代 通过新的数组,计算出的总和与推元件 新数组2
  • 我加在端

删除元素我不能以产生输出的下列上述格式。我能够做的输出

[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,[]] 
+0

什么是转换规则(我没有看到您的预期输出是什么意思)? – 2013-04-26 23:34:06

+0

@SergioTulentsev看起来像一个元素和其他每个元素之间的映射,当一个特定的元素是他们的价值被添加到其他元素的关键。 – 2013-04-26 23:37:20

+0

你的输出都不是有效的 - 你错过了一些] – 2013-04-26 23:39:02

回答

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, []]] 

注意,这是不是你指定的输出略有不同,但我相信这是你真正想。 (如果多于一个内部数组匹配每个组会怎样?)

+0

这是完美的!谢谢! – gkolan 2013-04-26 23:44:57

+0

我改变了问题中的输出以反映我的实际意思!现在来看第二个问题如何显示只能说小于8的元素? – gkolan 2013-04-26 23:51:19