带有Java套装的笛卡尔产品



我正在尝试在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;
}

这看起来更简单,

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;
}

假设您正在使用Apache Commons中的Pair,那么我认为您希望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循环比使用数组要好得多。请参阅Camilo的答案。

相关内容

  • 没有找到相关文章

最新更新