Я пытаюсь найти элегантный способ пошагового перебора всех возможных перестановок произвольного числа наборов или «сегментов». Мне нужно сделать это поэтапно, потому что я имею дело с большим количеством возможных перестановок и исчерпал пространство памяти, пытаясь сохранить все перестановки в памяти, а затем отсеять недопустимые. Вместо этого я пытаюсь выполнить каждую перестановку по одной за раз и сохранить ее только в окончательном списке в памяти, если он действителен, чтобы я мог сэкономить место в памяти.
Я пытался написать ручное решение для этого, и оказалось, что это немного сложно - я не хочу точно знать, сколько списков / наборов я имею в виду, поэтому я не может использовать подход грубой силы создания серии вложенных циклов. Создание собственного итератора для этого оказалось своим собственным набором проблем.
Я надеялся, что будут некоторые встроенные методы или инструменты, которые я мог бы использовать для этого, не изобретая колесо.
Вот пример: допустим, у меня есть пара наборов букв:
[a, b, c], [n, c, a]
И моя цель - найти все возможные сочетания букв из этих двух «ведер», но только те, которые не имеют дубликатов в своих наборах (в реальном мире могут быть более сложные требования, просто используя этот простой пример для примера). Итак, все возможные перестановки:
[a, n], [a, c], [a, a],
[b, n], [b, c], [b, a],
[c, n], [c, c], [c, a].
Теперь, когда у меня есть все возможные перестановки, я хочу отсеять те, которые не удовлетворяют требованиям: [a, a] and [c, c]
.
Вместо того, чтобы отсеивать их после факта (и занимать место во временной памяти, где оно могло бы быть заполнено допустимой комбинацией), я хочу проверить при каждой созданной перестановке, является ли она действительной, прежде чем сохранять ее в памяти ,
Есть ли в * 1021 что-нибудь, что могло бы облегчить это?
РЕДАКТИРОВАТЬ: я смог выяснить, как я мог сделать это, создав свой собственный класс "итератор", который проходит через каждую перестановку, и "пузыриться", если окончательный набор был циклически пройден полностью, в порядке чтобы убедиться, что я ударил каждую перестановку. Я могу опубликовать решение здесь, если кто-то заинтересован (возможно, немного неэффективным) решением, но я все же хотел бы знать, есть ли более простой способ сделать это, используя некоторые встроенные Kotlin инструменты.