Фиксированное место перестановка/комбинация
-
06-09-2019 - |
Вопрос
Я ищу способ, в котором я могу сгенерировать различную комбинацию из 4 элементов наборов таким образом, что элемент каждого набора имеет фиксированное место в окончательной комбинации: чтобы лучше объяснить мое требование, позвольте мне дать образец этих 4 наборов и, наконец, что я я ищу:
Установите#1 (улица Pre Direction) {n, s} set#2 (street name) {frankford, baily} set#3 (street type) {ave, st} set#4 (уличное направление сообщения) {s}
Позвольте мне перечислить несколько ожидающих комбинаций:
N Baily Ave S
S Frankford St S
S baily av s
.
.
.
Теперь, как вы можете видеть, что элемент каждого набора падает на его место
Предварительное направление на месте 1
Название улицы на месте 2
Тип стрити на месте 3
Уличное описание на месте 4
Я ищу наиболее эффективный способ выполнения этой задачи, один из способов сделать это - работать в 2 сетах за раз, например:
Создайте комбинацию набора 1 и набора 2 -> Создайте новый набор 5 полученных комбинаций
Сделайте комбинацию набора 5 и наборов 3 -> Создайте новый набор 6 полученных комбинаций
Создайте сочетание набора 6 и набора 4 -> Это даст мне окончательные комбинации
Есть ли лучший способ сделать это? Пожалуйста, помогите. Я предпочту C# или Java.
Спасибо
Решение 3
@ David B Что если список предсказаний пуст, есть ли способ, которым мы все еще получаем комбинации, поскольку через ваш путь не будет возвращен декартовой продукт.
Дэвид Б. Здесь:
var query =
from d in predirections.DefaultIfEmpty()
from n in names.DefaultIfEmpty()
from t in types.DefaultIfEmpty()
from s in postdirections.DefaultIfEmpty()
select new {d, n, t, s};
Другие советы
Вот какой -то LINQ (C#), который дает вам все комбинации, это не «самый эффективный способ».
var query =
from d in predirections
from n in names
from t in types
from s in postdirections
select new {d, n, t, s};
Похоже, вы ищете картезианский продукт некоторых наборов. Вы можете сделать это, используя вложенные для петли. Вот код Haskell, который вы не просили.
Prelude> [[x,y] | x <- ['1'..'3'], y <- ['A'..'C']]
["1A","1B","1C","2A","2B","2C","3A","3B","3C"]