获取笛卡尔积?

时间:2015-05-18 09:42:19

标签: java list collections

我有两个清单:

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

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

List<Pair<Integer, Integer> > partnerPlatformPairList;

其中Pairorg.apache.commons.lang3.tuple.Pair包中的一个类。

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

4 个答案:

答案 0 :(得分:2)

有一个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)));

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

}

答案 3 :(得分:1)

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