我有3组不同的数字,例如
一个= {1,3,4}
B = {2,6}
c = {0}
集合的大小可以是可变的,例如一组有5个元素,另一组有3个等等。
我已将这些值保存在java中的hashmap中,
HashMap H=new HashMap<String,HashSet<Integer>>();
对于这个例子,H的键是“a”,“b”和“c”。
我想在这三组中做出所有可能的数字组合,即:
1,2,0
1,6,0
3.2.0
3,6,0
4,2,0
4,6,0
但我有一个问题。集合的数量也可以是可变的,即我的HashMap可以有3到10个密钥。你知道我应该如何迭代hashmap,以便我可以进行所有可能的组合吗?
解答: 我将HashMap更改为Vector,但是,它也可以使用HashMap进行少量更改
调用该函数如下:
Iterate_over_map(0,new Integer[h.size()],h,final_list);
Iterate_over_map(int count,Integer[] curr,Vector<HashSet<Integer>> h,Vector<Integer[]> final_list)
{
if(count>=h.size())
{
final_list.addElement(curr.clone());
return;
}
int next_count=count+1;
for (Integer element:h.elementAt(count))
{
curr[count]=element;
Iterate_over_map(next_count,curr,h,final_list);
}
}
OLD解决方案
for(int x:H.get("a"))
{
v[0]=x;//node1 (an ortholog of node1)
for(int y:H.get("b"))
{
v[1]=y;//node2 (an ortholog of node2)
for(int z:H.get("c"))
{
v[2]=z;//node3 (an ortholog of node3)
}
}
}
非常感谢。
答案 0 :(得分:1)
你应该使用递归函数。我做的例子
public static void main(String[] args) {
String[] keys = map.keySet().toArray(new String[0]);
loopMap(map, keys, 0, "");
}
public static void loopMap(Map<String, Set<Integer>> map, String[] keys, int index, String res) {
if (index == keys.length) {
System.out.println(res);
return;
}
Set<Integer> set = map.get(keys[index]);
for(Integer ele : set) {
loopMap(map, keys, index + 1, res + ele);
}
}
使用:map使用LinkedHashMap,set为LinkedHashSet并检查null ^^
答案 1 :(得分:1)
您需要使用递归而不是嵌套循环,这将执行您想要的操作:
public static void main(String[] args)
{
List<List<Integer>> integers = new ArrayList<List<Integer>>();
integers.add(Arrays.asList(1, 3, 4));
integers.add(Arrays.asList(2, 6));
integers.add(Arrays.asList(0));
List<List<Integer>> combinations = combine(integers);
System.out.println(combinations);
}
private static List<List<Integer>> combine(List<List<Integer>> allIntegers)
{
List<Integer> integers = allIntegers.remove(0);
List<List<Integer>> allCombinations = new ArrayList<List<Integer>>();
for (Integer i : integers)
{
if (allIntegers.isEmpty())
{
allCombinations.add(new ArrayList<Integer>(Arrays.asList(i)));
}
else
{
for (List<Integer> combinations : combine(new ArrayList<List<Integer>>(allIntegers)))
{
combinations.add(0, i);
allCombinations.add(combinations);
}
}
}
return allCombinations;
}
产生输出:
[[1, 2, 0], [1, 6, 0], [3, 2, 0], [3, 6, 0], [4, 2, 0], [4, 6, 0]]