如何获得两个列表的笛卡尔积?
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;
}
}
我有两个列表:
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;
}
}