我有一个非常奇怪的问题,它有一些限制因素很难解决。我有一个列表列表,我想要对这些列表中的所有项目进行组合。每个项目都有一个名称和一个值。这是一个例子:
主要清单:
最终结果应如下所示:
一些清单:
新列表几乎包含类似哈希映射的项目。
约束如下:
换句话说,这个组合生成器可以用X个列表来填充,每个列表可以包含N个项目,我必须生成它们的组合,而不需要使用太多的内存。
我不希望一次使用超过5个列表,但我想使算法尽可能适应代码更改。
我正在解决java中的问题,但算法也应该在其他语言中同样工作,因为它很可能被翻译。
你有什么想法和建议吗?
提前致谢。
P.S。我认为递归不会很好。我正在研究使用while循环和一些嵌套循环的想法,但是很难想象它应该如何工作。
答案 0 :(得分:2)
所以这是笛卡儿的产品,你在追求?
假设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
答案 1 :(得分:1)
您无需使用任何内存来解决此问题。可以在不创建整个组合的情况下获得数学列表的第N个元素。它解释为here
答案 2 :(得分:0)
如何为每个给定列表创建一个索引数组?可以通过依次对每个列表执行get()来读取当前组合。每个指数都为零 - 然后进入下一个有效的组合
index[0]++;
if (index[0] >= list[0].size()) {
index[0] = 0;
index[1]++;
if (index[1] >= list[1].size()) {
...
}
}
(将嵌套的if转换为迭代,作为读者的练习。)
答案 3 :(得分:0)
为什么不实际制作散列图?
Map<String,Map<String,String>> mainMap = new HashMap<String,Map<String,String>>();
for(List l : lists) {
for(Data d : l) {
String item = d.item;
String name = d.name;
String value = d.value;
Map<String,String> itemMap = mainMap.get(item);
if(item == null) {
itemMap = new HashMap<String,String>();
mainMap.put(item,itemMap);
}
itemMap.put(name,value);
}
}
以后,您想要获取给定名称的所有值,无论哪个项目?
List<String> getValuesForName(String name) {
List<String> list = new LinkedList<String>();
for(Map<String,String map : mainMap) {
String value = map.get(name);
if(value != null) list.add(value);
}
return list;
}