【问题标题】:Cartesian Products with sets in javajava中带有集合的笛卡尔积
【发布时间】:2014-02-08 00:34:08
【问题描述】:

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

【问题讨论】:

  • 您从哪里获得Pair 课程?阿帕奇公地?无论如何,我认为您需要创建一个Pair&lt;S,T&gt; 对象以用作product.add 的参数。对于采用两个参数的集合,没有 add 方法。另外,我假设arrayA 应该是S 的数组,而不是String... 另外,您没有正确使用toArray;如果a 小于100,它不会改变数组的长度,如果a 更大,它不会做任何有用的事情。 arrayA = a.toArray(new S[0]); 更好,b 类似。

标签: java set product cartesian


【解决方案1】:

这看起来更简单,

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

【讨论】:

  • 如果这个 Pair 来自 Apache Commons,则没有两个参数的构造函数,除非我正在查看文档的过时版本。我认为 Java 7 没有在任何地方定义 Pair 类。他们是否将其添加到 Java 8 中?
  • 你说得对,只是编辑了一下,没想到真的相关,他还不如干脆实现自己的Pair类
【解决方案2】:

假设您使用的是来自 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 的回答。

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2015-01-28
    • 2012-09-07
    • 1970-01-01
    • 2013-12-25
    • 2017-08-30
    • 2010-10-17
    • 2018-09-28
    相关资源
    最近更新 更多