java - 属性值的组合
问题描述
我很难生成属性列表的所有可能的值组合。例如,对于具有以下值的三个属性 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 函数 where attribute_to_domain
is aMap
我们将每个属性作为 akey
并将其值作为 a value
,我们将每个组合作为 an添加<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
空元素,我无法保留通过调用对其进行的更改。
请问我该如何解决这个问题?提前致谢。
解决方案
有一种更简单、更快的解决方案,不需要递归。
可以提前计算输出组合的数量:在您的情况下,属性相乘,2*2*2
但对于每个组合都是如此。
此外,我们可以根据组合索引计算出每个组合中将放置哪个值。如果我们假设组合索引从 0 到 7:
for A
:
- 组合 0-3 将包含a1
- 组合 4-7 将包含a2
for B
- 组合 0,1,4,5 将包含b1
- 组合 2,3,6,7 将包含b2
for C
- 组合 0,2,4,6 将包含c1
- 组合 1,3,5,7 将包含c2
所以值放置的公式是基于组合索引、属性的顺序(A
第一等)和属性中值的顺序。
该算法的复杂度为 o(n*m),其中 n 是属性数和 m 值数。
推荐阅读
- asp.net-core - ASP.NET Core 2.1 - 带有注册的多个 appSettings
- angular6 - 如何在primeng的帮助下使用primeng turbotable获取行数
- python - 如何在 Linux RHEL 上升级 Python 3?
- android - 为什么 onActivityResult() 只在 requestCode>=0 时调用?
- node.js - beforeConstruct 中的动态 options.addFields 不起作用
- git - Importing repository in Azure DevOps with Git LFS
- javascript - 用ajax和php删除图片
- python - python script fails running as a daemon (EOFError: EOF when reading a line)
- docker-compose - Use docker swarm without docker machine
- sql - SQL_Add 约束并使用 LIKE 检查字符串