В другой вопрос Мне был предоставлен отличный ответ, включающий генерацию определенных наборов для задачи китайского почтальона.
Ответ был следующий:
def get_pairs(s):
if not s: yield []
else:
i = min(s)
for j in s - set([i]):
for r in get_pairs(s - set([i, j])):
yield [(i, j)] + r
for x in get_pairs(set([1,2,3,4,5,6])):
print x
выдаст желаемый результат:
[(1, 2), (3, 4), (5, 6)]
[(1, 2), (3, 5), (4, 6)]
[(1, 2), (3, 6), (4, 5)]
[(1, 3), (2, 4), (5, 6)]
[(1, 3), (2, 5), (4, 6)]
[(1, 3), (2, 6), (4, 5)]
[(1, 4), (2, 3), (5, 6)]
[(1, 4), (2, 5), (3, 6)]
[(1, 4), (2, 6), (3, 5)]
[(1, 5), (2, 3), (4, 6)]
[(1, 5), (2, 4), (3, 6)]
[(1, 5), (2, 6), (3, 4)]
[(1, 6), (2, 3), (4, 5)]
[(1, 6), (2, 4), (3, 5)]
[(1, 6), (2, 5), (3, 4)]
Это действительно демонстрирует выразительность Python, потому что это почти точно так, как я бы написал псевдокод для алгоритма.Мне особенно нравится использование yield и способа, которым наборы рассматриваются как первоклассные граждане.
Однако в этом и заключается моя проблема.
Что было бы лучшим способом:
1.Дублировать функциональность конструкции yield return в Java?Вместо этого было бы лучше сохранить список и добавить мои частичные результаты в этот список?Как бы вы справились с ключевым словом yield.
2. Обращаться с сетами?Я знаю, что мог бы, вероятно, использовать одну из коллекций Java, которая реализует интерфейс Set, а затем использовать такие вещи, как removeAll (), чтобы дать мне разницу в наборе.Это то, что вы будете делать в этом случае?
В конечном счете, я собираюсь свести этот метод к как можно более кратким и понятным способам в Java.Я думаю, что возвращаемый тип java-версии этого метода, скорее всего, вернет список массивов int или что-то подобное.
Как бы вы справились с описанными выше ситуациями при преобразовании этого метода в Java?