2011-02-23 32 views
0

我要比較一個數組內的哈希值:如何用修正因子創建散列的差異?

h_array = [ 
    {:name => "John", :age => 23, :eye_color => "blue"}, 
    {:name => "John", :age => 22, :eye_color => "green"}, 
    {:name => "John", :age => 22, :eye_color => "black"} 
] 

get_diff(h_array, correct_factor = 2) 
# should return [{:eye_color => "blue"}, {:eye_color => "green"}, {:eye_color => "black"}] 

get_diff(h_array, correct_factor = 3) 
# should return 
# [[{:age => 23}, {:age => 22}, {:age => 22}], 
# [{:eye_color => "blue"}, {:eye_color => "green"}, {:eye_color => "black"}]] 

我想diff的包含在h_array的哈希值。它看起來像遞歸調用/方法,因爲h_array可以具有多個哈希值,但具有相同數量的鍵和值。我如何實現get_diff方法?

+0

數組中的哈希鍵是否總是相同? – macarthy 2011-02-23 12:43:58

+1

'correct_factor'的含義是什麼? – 2011-02-23 13:21:14

+0

我不明白'correct_factor'是爲了什麼? – jamiei 2011-02-23 17:43:30

回答

0
class Array 
    def find_ndups  # also returns the number of items 
     uniq.map { |v| diff = (self.size - (self-[v]).size); (diff > 1) ? [v, diff] : nil}.compact 
    end 
end 
h_array = [ 
    {:name => "John", :age => 22, :eye_color => "blue", :hair => "black"}, 
    {:name => "John", :age => 33, :eye_color => "orange", :hair => "green"}, 
    {:name => "John", :age => 22, :eye_color => "black", :hair => "yello"} 
] 
def get_diff(h_array, correct_factor) 
    temp = h_array.inject([]){|result, element| result << element.to_a} 
    master_array = [] 
    unmatched_arr = [] 
    matched_arr = [] 
    temp = temp.transpose 
    temp.each_with_index do |arr, index| 
    ee = arr.find_ndups 
    if ee.length == 0 
     unmatched_arr << temp[index].inject([]){|result, arr| result << {arr.first => arr.last} } 

    elsif ee.length > 0 && ee[0][1] != correct_factor && ee[0][1] < correct_factor 
     return_arr << temp[index].inject([]){|result, arr| result << {arr.first => arr.last} } 
    elsif ee[0][1] = correct_factor 
     matched_arr << temp[index].inject([]){|result, arr| result << {arr.first => arr.last} } 
    end 

    end 
    return [matched_arr, unmatched_arr] 
end 

puts get_diff(h_array, 2).inspect 

希望它有助於

1
def get_diff h_array, correct_factor 
    h_array.first.keys.reject{|k| 
    h_array.map{|h| h[k]}.sort.chunk{|e| e}.map{|_,e| e.size}.max >= correct_factor 
    }.map{|k| 
    h_array.map{|hash| hash.select{|key,_| k == key}} 
    } 
end