迭代数组

时间:2013-05-01 10:48:24

标签: java hashmap

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

非常感谢。

2 个答案:

答案 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]]