Фиксированное место перестановка/комбинация

StackOverflow https://stackoverflow.com/questions/924217

  •  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"]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top