【发布时间】:2018-10-15 06:42:27
【问题描述】:
我很难生成属性列表的所有可能的值组合。例如,对于具有以下值的三个属性 A、B、C:A 的 {a1,a2}、B 的 {b1,b2} 和 C 的 {c1,c2},我应该得到 8 个组合:
a1,b1,c1
a1,b1,c2
a1,b2,c1
a1,b2,c2
a2,b1,c1
a2,b1,c2
a2,b2,c1
a2,b2,c2
我使用了以下两个递归java函数,其中attribute_to_domain是Map,我们将每个属性作为key并将其值作为value,我们将每个组合作为<ArrayList<String>添加到enumerate_tuples 作为ArrayList<ArrayList<String>>
public void fillTuples(Map<String, Set<String>> attribute_to_domain, ArrayList<String> attributes, ArrayList<ArrayList<String>> enumerate_tuples)
{
for (Map.Entry<String, Set<String>> entrySet :attribute_to_domain.entrySet()) {
String attribute=entrySet.getKey();
attributes.add(attribute);
}
int pos = 0;
Set<String> domain = attribute_to_domain.get(attributes.get(pos));
for (Iterator<String> it = domain.iterator(); it.hasNext();) {
String val = it.next();
ArrayList<String> tuple=new ArrayList<String>();
tuple.add(val);
fillTuples(attribute_to_domain, attributes, 1, tuple, enumerate_tuples);
tuple.remove(tuple.size()-1);
assert(tuple.isEmpty());
}
}
public void fillTuples(Map<String, Set<String>> attribute_to_domain, ArrayList<String> attributes, int pos, ArrayList<String> tuple, ArrayList<ArrayList<String>> enumerate_tuples)
{
assert(tuple.size() == pos);
if (pos == attributes.size())
{
enumerate_tuples.add(tuple);
return;
}
Set<String> domain = attribute_to_domain.get(attributes.get(pos));
for (Iterator<String> it = domain.iterator(); it.hasNext();) {
String val = it.next();
tuple.add(val);
fillTuples(attribute_to_domain, attributes, pos+1, tuple, enumerate_tuples);
tuple.remove(tuple.size()-1);
}
}
我得到的问题是 enumerate_tuples 带有空元素,我无法保留通过调用对其进行的更改。
请问我该如何解决这个问题?提前致谢。
【问题讨论】:
-
a1 b1 c1 怎么样?
-
为什么是奇怪的方法名称?这个约定是从哪里来的?
-
请阅读 java 命名约定。你到处都在违反它们,这使得你的代码对于习惯阅读 java 代码的人来说真的很难阅读。并且:阅读有关在 Java 中使用 assert() 的优点(和许多缺点)。大多数时候,这确实是个坏主意。然后我想知道为什么要使用 Iterators 来迭代简单的集合。您的代码与惯用的 Java 完全相反...
-
其实我是把代码从C++转成Java的,所以我认为问题出在C++中通过引用和Java中的值传递参数。
标签: java recursion arraylist hashmap