У меня есть три массива. Я хочу объединить три из них, но порядок имеет значение, и я НЕ хочу возвращать все перестановки. Так например:
STATE = [ 'Pennsylvania' ]
COUNTY = [ 'Bucks', 'Montgomery']
PROFESSION = ['Doctor', 'Firefighter', 'Teacher']
Ожидаемый результат:
[
['Pennsylvania', 'Bucks', 'Doctor'],
['Pennsylvania', 'Bucks', 'Firefighter'],
['Pennsylvania', 'Bucks', 'Teacher'],
['Pennsylvania', 'Montgomery', 'Doctor'],
['Pennsylvania', 'Montgomery', 'Firefighter'],
['Pennsylvania', 'Montgomery', 'Teacher']
]
Вот и все. Состояние всегда будет первым элементом. Округ всегда будет вторым пунктом. Профессия всегда будет третьим элементом и именно в этом порядке. Повторов быть не должно.
Список ГОСУДАРСТВ, ГРАФЕЙ и ПРОФЕССИИ будет продолжать расти. Но все будет по той же схеме.
Здесь все неверно:
['Bucks', 'Pennsylvania', 'Doctor']
['Teacher', 'Montgomery', 'Pennsylvania']
['Pennsylvania', 'Bucks', 'Montgomery']
Так что я пробовал? Я подумал, что, возможно, использование перестановок будет хорошим инструментом. Но, как вы догадываетесь, он создал всевозможные комбинации. Поэтому я попытался использовать ленивый итератор, чтобы ограничить результаты:
( STATE + COUNTY + PROFESSION ).permutation(3).lazy.first(10)
=> [["Pennsylvania", "Bucks", "Montgomery"], ["Pennsylvania", "Bucks", "Doctor"], ["Pennsylvania", "Bucks", "Firefighter"], ["Pennsylvania", "Bucks", "Teacher"], ["Pennsylvania", "Montgomery", "Bucks"], ["Pennsylvania", "Montgomery", "Doctor"], ["Pennsylvania", "Montgomery", "Firefighter"], ["Pennsylvania", "Montgomery", "Teacher"], ["Pennsylvania", "Doctor", "Bucks"], ["Pennsylvania", "Doctor", "Montgomery"]]
Но, как вы можете видеть, порядок, который я хочу, не сохраняется в этом подмассиве, а также это очень ошибочно, поскольку каждый массив будет иметь переменную длину и будет расти.
Как правильно решить эту проблему в Ruby?
Используйте Массив # продукт
STATE.product(COUNTY, PROFESSION)
=> [["Pennsylvania", "Bucks", "Doctor"],
["Pennsylvania", "Bucks", "Firefighter"],
["Pennsylvania", "Bucks", "Teacher"],
["Pennsylvania", "Montgomery", "Doctor"],
["Pennsylvania", "Montgomery", "Firefighter"],
["Pennsylvania", "Montgomery", "Teacher"]]
То, что вы ищете, - это продукт списков, а не комбинации, как дает вам функция перестановки. Ваш код даже вернет такие вещи, как ["Teacher", "Firefighter", "Montgomery"]
, где у вас есть две профессии. К счастью, массивы Ruby предоставляют функция продукта:
STATE.product(COUNTY, PROFESSION)
=> [["Pennsylvania", "Bucks", "Doctor"], ["Pennsylvania", "Bucks", "Firefighter"], ["Pennsylvania", "Bucks", "Teacher"], ["Pennsylvania", "Montgomery", "Doctor"], ["Pennsylvania", "Montgomery", "Firefighter"], ["Pennsylvania", "Montgomery", "Teacher"]]
Продукт списков A, B и C вернет все отдельные списки из трех элементов, которые содержат по одному элементу каждый из A, из B и из C в указанном порядке. Сравните это с вызванной вами функцией permutation
, которая берет ваши три списка соединены вместе и дает вам все комбинации трех различных элементов из единого списка. Когда вы объединяете, вы отбрасываете разделение между элементами, которые вам нужны.
К сожалению, не видел вашего ответа перед отправкой своего. +1 добросовестно :)