0

我正在尝试在 java 中创建一个笛卡尔积方法,该方法接受集合作为参数并返回一个集合对。我的代码将参数集转换为数组,然后进行笛卡尔积,但我无法将其添加回我想要返回的集合对。有没有更简单的方法来做到这一点?提前致谢。

public static <S, T> Set<Pair<S, T>> cartesianProduct(Set<S> a, Set<T> b) {
    Set<Pair<S, T>> product = new HashSet<Pair<S, T>>();


    String[] arrayA = new String[100];
    String[] arrayB= new String[100];

    a.toArray(arrayA);
    b.toArray(arrayB);

    for(int i = 0; i < a.size(); i++){
        for(int j = 0; j < b.size(); j++){
            product.add(arrayA[i],arrayB[j]);
        }
    }
    return product;
}
4

2 回答 2

2

这看起来更简单,

public static <S, T> Set<Pair<S, T>> cartesianProduct(Set<S> a, Set<T> b) {
    Set<Pair<S, T>> product = new HashSet<Pair<S, T>>();

    for(S s : a) {
        for(T t : b) {
            product.add(new ImmutablePair<S, T>(s,t));
        }
    }

    return product;
}
于 2014-02-08T01:01:37.817 回答
0

假设您使用Pair的是 Apache Commons,那么我认为您add希望

product.add(Pair.of(arrayA[i],arrayB[j]));

add对于带有两个参数的集合,没有方法。您必须创建Pair添加到集合中。如果这不能编译,请尝试

product.add(Pair<S,T>.of(arrayA[i],arrayB[j]));

另外,我假设你的意思是ST你的数组,而不是String. 没有理由预先分配一定数量的元素。此外,您编写它的方式,如果任一集合中有超过 100 个元素,toArray将返回一个具有所需大小的全新数组,但您没有使用函数结果,因此该数组将丢失。我更喜欢:

S[] arrayA = a.toArray(new S[0]);
T[] arrayB = b.toArray(new T[0]);

零长度数组只是“傻瓜”,其目的是toArray返回具有正确元素类型的数组,而不是Object[].

编辑:使用增强for循环比使用数组好得多。见卡米洛的回答。

于 2014-02-08T01:01:00.930 回答