2013-05-11 93 views
0

与条件对象的唯一数组我有对象的数组,并希望建立由属性“位置”的独特阵列,像如何建立红宝石

boxes.to_a.uniq! {|p| p[:position] } 

,但我想抛出所有之前区分如果第二个属性“不匹配”相等或更高,则双打。例如我有:

{ position: 233, mismatch: 3}, 
{ position: 234, mismatch: 3}, 
{ position: 233, mismatch: 1} 

和在最后,我想保持具有较少的不匹配的一种:

{ position: 234, mismatch: 3}, 
{ position: 233, mismatch: 1} 

因为位置是在加工对象物1和3中的相同,但不匹配较少在最后一个对象中。

编辑:盒是对象数组和我建立它这样:

@boxes = [] 

... 

@boxes << { 
       :position => i, 
       :mismatch => mm, 
      } 

其中位置和错配上方的DNA序列计算出的。不匹配表示对9个核苷酸的主题的汉明距离(串像“TTGATGCTT”)

+0

什么是'boxes'最初?哈希无论如何都不能有重复的密钥,所以这有点令人困惑。 – squiguy 2013-05-11 23:37:07

回答

3

我不知道这些散列代表,所以你大概可以想到的更好的变量名称。

尝试:

boxes = [ 
    { position: 233, mismatch: 3}, 
    { position: 234, mismatch: 3}, 
    { position: 233, mismatch: 1}, 
] 

boxes.group_by{ |box| box[:position] } 
    .map{ |_, boxes| boxes.min_by{ |box| box[:mismatch] } } 
#=> [{:position=>233, :mismatch=>1}, {:position=>234, :mismatch=>3}] 
+0

谢谢,我想我明白这是如何工作的。 – adrian 2013-05-12 10:30:52

0

事情是这样的:

new_boxes = {} 

boxes.each do |box| 
    pos = box[:position] 
    if new_boxes[pos] && new_boxes[pos][:mismatch] > box[:mismatch] 
    new_boxes[pos] = box 
    end 
end 

boxes = new_boxes.values 
0
boxes = [ 
    { position: 233, mismatch: 1}, 
    { position: 234, mismatch: 3}, 
    { position: 233, mismatch: 3}, 
    { position: 234, mismatch: 2} 
] 

boxes.sort_by{|x| x.values } 
    .uniq{|y| y[:position]} 

#=> [{:position=>233, :mismatch=>1}, {:position=>234, :mismatch=>2}]