2013-03-22 133 views
0

我有一个2-d红宝石阵列,它看起来是这样的:红宝石正则表达式 - 阵列

(Array) - @main.each do |value| 

value[0] value[1] value[2] 

3.0.1.2  TOTAL  Pass 
3.0.1.3  TOTAL  Pass 
3.4.0.1  8K   Fail 
3.5.4.3  9K   Fail 
3.5.0.9  TOTAL  Fail 

我想将它们单独成2列,使得第一个应该有“合计”和所有行其他阵列应该有其他的一切。

回答

1

我不太明白你的阵列的字段,但你可以使用select和拒绝:

totals = @main.select{|entry| entry == "TOTAL"} 
others = @main.reject{|entry| entry == "TOTAL"} 

对于你的每个元素的任何测试。最初的@main将保持原样,您可以使用总计和其他来访问元素。

+1

与['可枚举#partition'(HTTP做在[一通(http://stackoverflow.com/a/15583917/1074296)://红宝石-doc.org/core-2.0/Enumerable.html#method--partition) – dbenhur 2013-03-23 06:06:53

1

你的问题没有很好地解释,但作为一个快速猜测你想,我会建议看Array.group_by什么,这是可枚举的一部分:

ary = [ 
    %w[3.0.1.2  TOTAL  Pass], 
    %w[3.0.1.3  TOTAL  Pass], 
    %w[3.4.0.1  8K   Fail], 
    %w[3.5.4.3  9K   Fail], 
    %w[3.5.0.9  TOTAL  Fail], 
] 


ary.group_by{ |a| a.last } 

返回一个哈希,用钥匙是最后一个元素的两个不同值中的子阵列:

{ 
    "Pass" => [ 
     [0] [ 
      [0] "3.0.1.2", 
      [1] "TOTAL", 
      [2] "Pass" 
     ], 
     [1] [ 
      [0] "3.0.1.3", 
      [1] "TOTAL", 
      [2] "Pass" 
     ] 
    ], 
    "Fail" => [ 
     [0] [ 
      [0] "3.4.0.1", 
      [1] "8K", 
      [2] "Fail" 
     ], 
     [1] [ 
      [0] "3.5.4.3", 
      [1] "9K", 
      [2] "Fail" 
     ], 
     [2] [ 
      [0] "3.5.0.9", 
      [1] "TOTAL", 
      [2] "Fail" 
     ] 
    ] 
} 

访问的一个或另一个是容易的:

ary.group_by{ |a| a.last }['Pass'] 
[ 
    [0] [ 
     [0] "3.0.1.2", 
     [1] "TOTAL", 
     [2] "Pass" 
    ], 
    [1] [ 
     [0] "3.0.1.3", 
     [1] "TOTAL", 
     [2] "Pass" 
    ] 
] 

或者:

ary.group_by{ |a| a.last }['Fail'] 
[ 
    [0] [ 
     [0] "3.4.0.1", 
     [1] "8K", 
     [2] "Fail" 
    ], 
    [1] [ 
     [0] "3.5.4.3", 
     [1] "9K", 
     [2] "Fail" 
    ], 
    [2] [ 
     [0] "3.5.0.9", 
     [1] "TOTAL", 
     [2] "Fail" 
    ] 
] 
4
@main = [ 
    %w[3.0.1.2  TOTAL  Pass], 
    %w[3.0.1.3  TOTAL  Pass], 
    %w[3.4.0.1  8K   Fail], 
    %w[3.5.4.3  9K   Fail], 
    %w[3.5.0.9  TOTAL  Fail], 
] 

totals, others = @main.partition{|a| a[1] == 'TOTAL'} 

# totals => [["3.0.1.2", "TOTAL", "Pass"], ["3.0.1.3", "TOTAL", "Pass"], ["3.5.0.9", "TOTAL", "Fail"]] 
# others => [["3.4.0.1", "8K", "Fail"], ["3.5.4.3", "9K", "Fail"]] 
+0

这会对它进行分区,但新阵列只有a [1]字段.....我希望其他字段保持不变太。 – 2013-03-23 09:10:22

+0

@sagarvikani当我运行它时,新数组包含原始元组。 ['Enumerable#partition'](http://ruby-doc.org/core-2.0/Enumerable.html#method-i-partition)基于块的分区,但产生原始元素。 – dbenhur 2013-03-23 16:33:09

+0

@sagarvikani也许你可以更准确地向我们展示你的输入,因为你的问题有一个相当模糊的表示?我已经更新了这个答案,以说明我如何解释你的'@ main'的结构。 – dbenhur 2013-03-23 16:40:00