【问题标题】: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;

其中Pairorg.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;
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-19
          • 2012-01-03
          • 2023-02-19
          • 2021-03-05
          • 1970-01-01
          • 1970-01-01
          • 2015-10-21
          相关资源
          最近更新 更多