首頁 >Java >java教程 >如何在 Java 中計算任意多個集合的笛卡爾積?

如何在 Java 中計算任意多個集合的笛卡爾積?

Linda Hamilton
Linda Hamilton原創
2024-12-12 15:41:10367瀏覽

How to Compute the Cartesian Product of an Arbitrary Number of Sets in Java?

Java 中任意數量集合的笛卡爾積

處理多個集合時,常見的操作是計算它們的笛卡爾積,產生一個包含所有可能的集合輸入集中元素的組合。為了在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn