/ / Je to najlepší spôsob, ako získať spoločné prvky zo skrinky polí? - rubín

Je to najlepší spôsob, ako chytiť spoločné prvky z Hash arrays? - rubín

Snažím sa získať spoločný prvok zo skupiny polí v Ruby. Normálne môžete použiť & operátor porovnáva dve polia, ktoré vracajú prvky, ktoré sú prítomné alebo bežné v oboch poliach. To je všetko dobré, s výnimkou prípadov, keď sa snažíte získať spoločné prvky z viac ako dva polí. Chcem však získať spoločné prvky z neznámy, dynamický počet polí, ktoré sú uložené v hashe.

Musel som sa uchýliť k použitiu metódy eval () v ruby, ktorá vykonáva reťazec ako skutočný kód. Tu je funkcia, ktorú som napísal:

  def get_common_elements_for_hash_of_arrays(hash) # get an array of common elements contained in a hash of arrays, for every array in the hash.
# ["1","2","3"] & ["2","4","5"] & ["2","5","6"] # => ["2"]
# eval("["1","2","3"] & ["2","4","5"] & ["2","5","6"]") # => ["2"]
eval_string_array = Array.new # an array to store strings of Arrays, ie: "["2","5","6"]", which we will join with & to get all common elements
hash.each do |key, array|
eval_string_array << array.inspect
end
eval_string = eval_string_array.join(" & ") # create eval string delimited with a & so we can get common values
return eval(eval_string)
end

example_hash = {:item_0 => ["1","2","3"], :item_1 => ["2","4","5"], :item_2 => ["2","5","6"] }
puts  get_common_elements_for_hash_of_arrays(example_hash) # => 2

Funguje to a je to skvelé, ale zaujímalo by ma ...eval, naozaj? Je to najlepší spôsob, ako to urobiť? Existujú dokonca akýkoľvek iné spôsoby, ako to dosiahnuť (samozrejme, okrem rekurzívnej funkcie). Ak má niekto nejaké návrhy, som všetky uši.

V opačnom prípade môžete tento kód použiť, ak potrebujete uchopiť spoločnú položku alebo prvok zo skupiny alebo hash polí, tento kód je tiež možné ľahko prispôsobiť na vyhľadávanie v poli polí.

odpovede:

15 pre odpoveď č. 1

Hľa, moc inject! ;)

[[1,2,3],[1,3,5],[1,5,6]].inject(&:&)
=> [1]

Ako už bolo spomenuté v Jordánsku, ak vaša verzia Ruby nemá podporu pre & poznámky, jednoducho použite

inject{|acc,elem| acc & elem}

0 pre odpoveď č. 2

Nemôžete urobiť iba porovnanie prvých dvoch, urobiť výsledok a porovnať ho s nasledujúcimi atď. Zdá sa, že to spĺňa vaše kritériá.


0 pre odpoveď č. 3

Prečo to neurobiť:

def get_common_elements_for_hash_of_arrays(hash)
ret = nil
hash.each do |key, array|
if ret.nil? then
ret = array
else
ret = array & ret
end
end
ret = Array.new if ret.nil? # give back empty array if passed empty hash
return ret
end