【问题标题】:How do I get a Cartesian product of two lists?如何获得两个列表的笛卡尔积?
【发布时间】:2015-07-29 18:11:04
【问题描述】:
我有两个列表:
List<Integer> partnerIdList;
List<Integer> platformIdList;
我需要得到这些列表的笛卡尔积,如下所示:
List<Pair<Integer, Integer> > partnerPlatformPairList;
其中Pair 是org.apache.commons.lang3.tuple.Pair 包中的一个类。
我怎样才能轻松做到这一点? apache-commons 库里有吗?
【问题讨论】:
标签:
java
list
collections
cartesian-product
【解决方案1】:
有一个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)));
【解决方案2】:
如果您不想使用外部解决方案、库,您可以在代码中编写自己的版本:
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;
}
【解决方案3】:
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)));
}
【解决方案4】:
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;
}
}