如何在飞行中做组合

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

主要清单:

  • 清单01:
    • Item 01:name:name01,value: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

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

约束如下:

  1. 我无法收集到新的列表并将它们混合起来,因为这些列表很快就会变得非常大。
  2. 我正在使用某种类似观察者的API,所以我需要尽快让观察者了解结果,这样我才不会使用太多内存。

换句话说,该组合生成器可以用X个列表来提供,每个列表可以包含N个项目,并且我必须生成它们的组合而不使用太多的存储器。

我不希望一次使用超过5个列表,但我想使算法尽可能适应代码更改。

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

你有什么想法,建议吗?

提前致谢。

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

所以这是笛卡儿的产品,你是在追求?

假设3个列表,包含2,1和3个元素。 你会以2 * 1 * 3组合结束= 6.(摘要:a * b * … * i)

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

void getCombiFor (int i, List > 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 

您不需要使用任何内存来解决此问题。 可以在不创建整个组合的情况下获得列表的第N个元素。 这里解释一下

如何创建一个索引数组,每个给定列表一个? 可以通过依次对每个列表执行get()来读取当前组合。 每个指数都为零 – 然后进入下一个有效的组合

 index[0]++; if (index[0] >= list[0].size()) { index[0] = 0; index[1]++; if (index[1] >= list[1].size()) { ... } } 

(将嵌套的if转换为迭代,作为读者的练习。)

你为什么不实际制作一个hashmap?

 Map> mainMap = new HashMap>(); for(List l : lists) { for(Data d : l) { String item = d.item; String name = d.name; String value = d.value; Map itemMap = mainMap.get(item); if(item == null) { itemMap = new HashMap(); mainMap.put(item,itemMap); } itemMap.put(name,value); } } 

之后,您想获得给定名称的所有值,无论哪个项目?

 List getValuesForName(String name) { List list = new LinkedList(); for(Map