Как стать автором
Обновить

Комментарии 16

Ой все. Ну давайте еще алгоритмы сортировки сюда постить.


На Java не писал лет 15, но какая разница…
Ну правда — ввожу в гугл "java permutations" и первая же ссылка достаточно подробно все объясняет.


Бонусом получаем ссылку на алгоритм Хипа, а при дальнейшем гуглении еще находится Алгоритм Нарайаны.
Заодно находится ссылка на хабр где можно почитать комментарии и понять что стоит подготовиться объяснить за производительность.

Статья не про перестановки, а про декартово произведение.

Спасибо за ссылку на интересный Алгоритм Нарайаны.
(тот случай когда коммент интреснее статьи :) )

Эти алгоритмы вообще другую задачу выполняют.

… а что, в Java нельзя такое сделать без создания дополнительной коллекции, просто возвращая итератор?

Можно, конечно
Такое — нет. По сету можно двигаться только вперед, а тут возникает необходимость вызывать previous(). Поэтому Set приходится превращать в List.

Во-первых, я говорю о выходных данных, где у вас List, а не о входных.
А во-вторых, я подозреваю, что и для входных вам не надо двигаться назад (вот множественная итерация может понадобиться, да).

Это же не перестановка в пределах одного множества, а комбинирование нескольких множеств с получением новых. Вернуть итератор мы можем, но новую коллекцию все равно придется создать.

Вернуть итератор мы можем, но новую коллекцию все равно придется создать.

Зачем? Java не умеет итераторы без коллекций?


комбинирование нескольких множеств с получением новых

Вот вам "комбинирование двух множеств" без создания коллекции (не на Java):


foreach (var c1 in collection1)
foreach (var c2 in collection2)
  yield return (c1, c2)

Хорошо видно, что коллекция для хранения результата целиком не нужна.

Ок, понял что вы имели в виду. Да, так можно.

Я видимо избалован Python — itertools.product() и все готово.

и работает год?)

Нет, это встроенная функция. Она не интерпретируется, а потому отработает быстро.

А guava чем не устраивает?


var models = ImmutableSet.of("audi", "bmw", "toyota", "vw");
var colors = ImmutableSet.of("red", "green", "blue", "yellow", "pink");
var engines = ImmutableSet.of("diesel", "gasoline", "hybrid");
var transmissions = ImmutableSet.of("manual", "auto", "robot");
Sets.cartesianProduct(models, colors, engines, transmissions).forEach(System.out::println);
Век живи — век учись )
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории