我正在尝试在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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
假设您正在使用来自Apache Commons的Pair
,那么我认为您希望add
成为
product.add(Pair.of(arrayA[i],arrayB[j]));
对于带有两个参数的集合,没有add
方法。您必须创建Pair
才能添加到集合中。如果没有编译,请尝试
product.add(Pair<S,T>.of(arrayA[i],arrayB[j]));
另外,我假设您的数组代表S
和T
,而不是String
。没有理由预先分配一定数量的元素。此外,你编写它的方式,如果任一组中有超过100个元素,toArray
将返回一个具有所需大小的全新数组,但你没有使用函数结果,所以数组将迷路了。我更喜欢:
S[] arrayA = a.toArray(new S[0]);
T[] arrayB = b.toArray(new T[0]);
零长度数组只是“假人”,其目的是让toArray
返回具有正确元素类型的数组,而不是Object[]
。
编辑:使用增强的for
循环比使用数组要好得多。请参阅Camilo的回答。