2013-05-11 96 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}]