2013-05-31 2 views
1

У меня есть несколько массивов, я просто скажу четыре. Например:Создание каждой комбинации из нескольких хешей

LOCATION = [:new_york, :california, :alaska, :missouri, :mississippi, :florida] 
TYPE  = [:high_rise, :mid_rise, :low_rise, :loft, :townhouse, :hotel] 
OWNERSHIP = [:coop, :condo, :condop, :rental, :single_family, :multi_family] 
BLDG_AGE = [:historic, :pre-war, :post-war, :modern] 

Мне нужен сценарий, который генерирует каждую комбинацию из них. Вот несколько примеров:

:new_york 
:new_york, :high_rise 
:new_york, :high_rise, :coop 
:new_york, :high_rise, :coop, :historic 

Это простые, просто куча вложенных циклов. Мне также нужны другие комбинации. Например:

:new_york, :coop 
:new_york, :pre-war 
:new_york, :rental, :modern 
:new_york, :high_rise, :single_family 

Но просто думаю, что все комбинации с тем исключением, что может оказаться в одиночестве только члены LOCATION.

+0

Рассматривали вы [это] (http://ruby-doc.org/ core-2.0/Array.html # method-i-combination) или [this] (http://ruby-doc.org/core-2.0/Array.html#method-i-permutation)? – squiguy

+0

Всего 4 основных петли сделают трюк. – oldergod

+0

Я работаю над ответом, который не требует, чтобы вы сказали, сколько массивов будет присутствовать .. но это немного. – xaxxon

ответ

3

Предполагая, что вы хотели :pre_war, :post_war вместо :pre-war, :post-war:

LOCATION = [:new_york, :california, :alaska, :missouri, :mississippi, :florida] 
TYPE  = [:high_rise, :mid_rise, :low_rise, :loft, :townhouse, :hotel] 
OWNERSHIP = [:coop, :condo, :condop, :rental, :single_family, :multi_family] 
BLDG_AGE = [:historic, :pre_war, :post_war, :modern] 

LOCATION.product([nil] + TYPE, [nil] + OWNERSHIP, [nil] + BLDG_AGE) 
.map(&:compact) 

Или более сгущенного:

LOCATION.product(*[TYPE, OWNERSHIP, BLDG_AGE].map{|a| [nil] + a}) 
.map(&:compact) 
+0

удивительный ответ. Я потратил час, переучивая кучу функциональности метода рубинового массива, чтобы собрать аналогичный, но гораздо менее рубиновый ответ, и ваше решение гораздо более дружелюбное. – xaxxon

Смежные вопросы