Создание групп (порядок подмассивов имеет значение) из нескольких массивов - PullRequest
0 голосов
/ 27 октября 2018

У меня есть три массива. Я хочу объединить три из них, но порядок имеет значение, и я НЕ хочу возвращать все перестановки. Так, например:

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?

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Вы ищете произведение списков, а не комбинации , как вам дает функция перестановки.Ваш код даже возвращает такие вещи, как ["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, которая берет три списка , объединенные вместе , и дает вам все комбинации трех различных элементов из объединенного списка .Когда вы объединяете, вы отбрасываете разделение между необходимыми элементами.

0 голосов
/ 27 октября 2018

Использование Массив # product

STATE.product(COUNTY, PROFESSION)
 => [["Pennsylvania", "Bucks", "Doctor"],
     ["Pennsylvania", "Bucks", "Firefighter"],
     ["Pennsylvania", "Bucks", "Teacher"],
     ["Pennsylvania", "Montgomery", "Doctor"],
     ["Pennsylvania", "Montgomery", "Firefighter"],
     ["Pennsylvania", "Montgomery", "Teacher"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...