我有一个很奇怪的问题,其中有一些限制使其难以解决。我有一个列表列表,我想对这些列表中的所有项目进行组合。每个项目都有一个名称和一个值。这是一个例子:

主要清单:

  • 清单01:
  • 项目01:名称:name01,值:value01
  • 项目02:名称:name02,值:value02
  • 列表02:
  • 项目01:名称:name03,值:value03
  • 清单03:
  • 项目01:名称:name04,值:value04
  • 项目02:名称:name05,值:value05

  • 最终结果应如下所示:

    一些清单:
  • 项目01:name01:value01,name03:value03,name04:value04
  • 项目02:name02:value02,name03:value03,name04:value04
  • 项目03:name03:value03,name03:value03,name04:value04
  • 项目04:name01:value01,name03:value03,name04:value05
  • 项目05:name02:value02,name03:value03,name04:value05
  • 项目06:name03:value03,name03:value03,name04:value05

  • 新列表几乎包含像哈希映射一样起作用的项目。

    约束如下:
  • 我无法收集到新列表并将其混合,因为这些列表可能很快会变得很大。
  • 我正在使用某种类似于观察者的api,因此我需要尽快让观察者了解结果,以免占用过多内存。

  • 换句话说,可以向此组合生成器提供X个列表,每个列表可以包含N个项目,我必须在不使用太多内存的情况下生成它们的组合。

    我不希望一次使用5个以上的列表,但我想使该算法尽可能地适应代码更改。

    我正在用Java解决问题,但是该算法也应该在其他语言中同样起作用,因为它很可能会被翻译。

    您有什么想法和建议吗?

    提前致谢。

    附言我认为递归不会很好。我正在考虑使用while循环和一些嵌套循环的想法,但是很难想象它应该如何工作。

    最佳答案

    这就是笛卡尔积,您在追求什么?

    假设3个列表包含2、1和3个元素。您将以2 * 1 * 3组合= 6结尾。(摘要:a * b * ... * i)

    现在您从0到5取6个数字。

    void getCombiFor (int i, List <List <Integer>> li)
    {
         if (li.length > 0)
         {
            int idx = i % li.get (0).size ();
            System.out.print (li.get (0).get(idx));
            getCombiFor (i - idx, li.remove (0));
         }
         System.out.println ();
    }
    // pseudocodeline:
    List li = List (List ('a', 'b'), List ('c'), List ('d', 'e', 'f'))
    for (int i = 0; i < 6; ++i)
    {
         getCombiFor (i, li);
    }
    

    例:
    Lists = ((a,b), (c), (d,e,f))
    acd
    bcd
    acf
    bcf
    ace
    bce
    

    10-02 10:04