處理多個集合時,常見的操作是計算它們的笛卡爾積,產生一個包含所有可能的集合輸入集中元素的組合。為了在 Java 中實現這一點,讓我們探索一個處理任意數量集合的解決方案。
笛卡爾積的遞歸方法
以下遞迴Java 方法cartesianProduct 計算任意數量集合的笛卡爾積:
public static Set<Set<Object>> cartesianProduct(Set<?>... sets) { if (sets.length < 2) throw new IllegalArgumentException("Can't have a product of fewer than two sets (got " + sets.length + ")"); return _cartesianProduct(0, sets); }
遞歸輔助方法_cartesianProduct透過將每個集合中的元素迭代新增至累積集合來建構笛卡爾積:
private static Set<Set<Object>> _cartesianProduct(int index, Set<?>... sets) { Set<Set<Object>> ret = new HashSet<Set<Object>>(); if (index == sets.length) { ret.add(new HashSet<Object>()); } else { for (Object obj : sets[index]) { for (Set<Object> set : _cartesianProduct(index + 1, sets)) { set.add(obj); ret.add(set); } } } return ret; }
範例用法
示範以下的用法對於此方法,請考慮問題中提供的範例,其中我們有三個包含類別Person、Gift 和的物件的集合禮物擴充。我們可以如下取得這些集合的笛卡爾積:
Set<Person> persons = ...; Set<Gift> gifts = ...; Set<GiftExtension> giftExtensions = ...; Set<Set<Object>> cartesianProduct = cartesianProduct(persons, gifts, giftExtensions);
產生的笛卡爾積將包含代表人員、禮物和禮物擴展的所有可能組合的集合。
通用型別資訊
需要注意的是,Java 的型別系統不允許方法傳回泛型型別具有任意數量的參數。這意味著,無論輸入集中元素的類型為何,cartesianProduct 方法都會傳回 Set
以上是如何在 Java 中計算任意多個集合的笛卡爾積?的詳細內容。更多資訊請關注PHP中文網其他相關文章!