Как мне создать разность хэшей с поправочным коэффициентом? - PullRequest
0 голосов
/ 23 февраля 2011

Я хочу сравнить хэши внутри массива:

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"}]]

Я хочу различить хэши, содержащиеся в h_array.Это похоже на рекурсивный вызов / метод, потому что h_array может иметь несколько хешей, но с одинаковым количеством ключей и значений.Как я могу реализовать метод get_diff?

Ответы [ 3 ]

1 голос
/ 24 февраля 2011
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
0 голосов
/ 28 февраля 2011

нашел это ActiveSupport :: CoreExtensions :: Hash :: Diff module .ActiveSupport 2.3.2 и 2.3.4 имеет встроенный модуль Hash :: Diff, который возвращает хеш, который представляет разницу между двумя хешами.

0 голосов
/ 24 февраля 2011
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

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...