例えば、Stringのようないくつかの項目のリストを与えるとしましょう。アイテムリストの要素を組み合わせの組み合わせに組み合わせる最も効率的な方法は?
list 1: "a", "b", "c"
list 2: "d", "e", "f"
list 3: "1", "2", "3"
results: (a, d, 1), (a, d, 2), ... (c, f, 3)
(実際のユースケースは、文字列と、そのようなとは何の関係もありません、これは単なるモックアップである)
私はそれを行うには、再帰的な方法を書いたが、私はそれので、それに満足していません(Javaの並行処理では、p241)、エデンGCは安いです。だから、私はオブジェクトの作成がJavaで安価であることを知っています。私の機嫌をとりなさい :)。
void combine(List<List<String>> itemLists, List<Set<String>> combinations, Set<String> partial) {
if (itemLists == null || itemLists.isEmpty()) return;
List<String> items = itemLists.get(0);
for (String s : items) {
Set<String> tmpSet = new HashSet<>(partial);
tmpSet.add(s);
if (itemLists.size() == 0) //termination test
combinations.add(tmpSet);
else
combine(itemLists.subList(1, itemLists.size()), combinations, tmpSet);
}
}
これはどうでしょうか。
edit:明らかに、私は順列を作りたくありません。私はsizeof(リストのリスト)が大きいセットを作成したいです。
まあ、あなたはループでそれを行うことができます...(再帰の必要はありません)。 –
リストには同じ数の要素が含まれていますか? – user1329572
すべてのセットをメモリに保存しますか?または、結果のセットで特定の組み合わせまたはプロパティを検索していますか? – Erica