Фиксированное место Перестановка / Комбинация - PullRequest
0 голосов
/ 29 мая 2009

Я ищу способ, с помощью которого можно сгенерировать различную комбинацию из 4 элементов набора таким образом, чтобы каждый элемент набора имел фиксированное место в окончательной комбинации: Чтобы лучше объяснить мое требование, позвольте мне привести образец этих 4 комплектов и, наконец, то, что я ищу:

Set # 1 (Street Pre Direction) {N, S} Сет № 2 (Название улицы) {Франкфорд, Бейли} Комплект № 3 (Тип улицы) {пр., Ул.} Комплект № 4 (Направление уличной почты) {S}

Позвольте мне перечислить несколько ожидаемых комбинаций:
N Baily Ave S
S Frankford St S
S Baily Av S
.
.
.

Теперь, как вы можете видеть, каждый элемент набора падает на свое место
Предварительное направление на месте 1
Название улицы находится на месте 2
Уличный тип на месте 3
Описание улицы в месте 4

Я ищу наиболее эффективный способ выполнения этой задачи. Один из способов сделать это - работать с двумя подходами одновременно, например:
Составьте комбинацию из набора 1 и набора 2 -> создайте новый набор из 5 полученных комбинаций
Составьте комбинацию из набора 5 и набора 3 -> создайте новый набор 6 из полученных комбинаций
Сделайте комбинацию из набора 6 и набора 4 -> Это даст мне окончательные комбинации

Есть ли лучший способ сделать это? Пожалуйста, помогите. Я предпочту C # или Java.

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 мая 2009

Вот некоторый 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};
1 голос
/ 29 мая 2009

Звучит так, будто вы ищете декартово произведение некоторых наборов. Вы можете сделать это используя вложенные циклы. Вот код на Haskell, который вы не просили.

Prelude> [[x,y] | x <- ['1'..'3'], y <- ['A'..'C']]
["1A","1B","1C","2A","2B","2C","3A","3B","3C"]
0 голосов
/ 29 мая 2009

@ Дэвид Б Что, если список предустановок пуст, есть ли способ, по которому мы все равно получим комбинации, поскольку по вашему пути ни один декартово произведение не будет возвращено.


Дэвид Б здесь:

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};
...