如何获得两个列表的笛卡尔积?

How do I get a Cartesian product of two lists?

我有两个列表:

List<Integer> partnerIdList;
List<Integer> platformIdList;

我需要得到这些列表的笛卡尔积,如下所示:

List<Pair<Integer, Integer> > partnerPlatformPairList;

其中 Pair 是来自 org.apache.commons.lang3.tuple.Pair 包的 class。

我怎样才能轻松做到这一点? apache-commons 库中有一些吗?

有一个github code。你可以调查一下。它基本上运行,for-loop 基于列表的数量和列表计数。它将减少您的编码工作量,但基础知识保持不变。

使用下面的代码

for (int i = 0; i < partnerIdList.size(); i++)
    for (int j = 0; j < platformIdList.size(); j++)
        partnerPlatformPairList.add(new Pair<Integer, Integer>(partnerIdList.get(i), platformIdList.get(j)));

如果您不想使用外部解决方案、库,您可以在代码中编写自己的版本:

public static <T, U> List<Pair<T, U>> cartesianProduct(List<T> list1, List<U> list2) {
    List<Pair<T, U>> result = new ArrayList<>();
    for (T el1: list1) {
        for (U el2 : list2) {
            result.add(Pair.of(el1, el2));
        }
    }
    return result;
}
public void cartesian() {

    List<Integer> array1 = new ArrayList<Integer>();

    List<Integer> array2 = new ArrayList<Integer>();

    List<Pair<Integer, Integer>> partnerPlatformPairList = new ArrayList<Pair<Integer, Integer>>();

    for (int i = 0; i < array1.size(); i++)
        for (int j = 0; j < array2.size(); j++)
            partnerPlatformPairList.add(new Pair<Integer, Integer>(array1.get(i), array2
                    .get(j)));

}
import java.util.ArrayList;
import java.util.List;

public class Track {
  public static void main(String x[]) {
    List<Integer> partnerIdList = new ArrayList<Integer>();
    List<Integer> platformIdList = new ArrayList<Integer>();

    for (int i = 2; i < 5; i++) {
      partnerIdList.add(i);
      platformIdList.add(i * i);
    }
    List<Pair<Integer, Integer>> partnerPlatformPairList = new ArrayList<Pair<Integer, Integer>>();

    for (Integer partnerId : partnerIdList) {
      for (Integer platformId : platformIdList) {
        partnerPlatformPairList.add(new Pair(partnerId, platformId));
      }
    }

    for (Pair pair : partnerPlatformPairList) {
      System.out.println(pair);
    }
  }
}

class Pair<Integer1, Integer2> {
  Integer partnerId;
  Integer platformId;

  Pair(Integer partnerId, Integer platformId) {
    this.partnerId = partnerId;
    this.platformId = platformId;
  }

  @Override
  public String toString() {
    return partnerId + " -  " + platformId;
  }
}