-5

我有 3 组不同的数字,例如
a={1,3,4}
b={2,6}
c={0}

集合的大小可以是可变的,例如一组包含 5 个元素,另一组包含 3 个元素,等等。

我已将这些值保存在 java 的哈希图中,

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 更改为 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);
    }

}

旧解决方案

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)
        }
    }
}

多谢。

4

2 回答 2

2

您应该使用递归函数。我做例子

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);
    }
}

with:map使用LinkedHashMap,设置为LinkedHashSet并检查null ^^

于 2013-05-01T11:55:25.867 回答
2

您需要使用递归而不是嵌套循环,这将满足您的要求:

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]]
于 2013-05-01T12:10:52.743 回答