递归迭代hashmap

时间:2011-03-16 09:00:48

标签: java recursion hashmap

我想从散列图中检索k,v对。 这些主题是这样的:

a = 3,4 
b = 5,6

等等。我需要这些价值观的组合。

a=3, b=5. 
a=3, b=6.
a=4, b=5.
a=4, b=6.

我不知道有多少个键和多少个值。使用entryset我可以得到值而不是组合。它看起来像递归但是怎么样?

这是我的代码:

HashMap<String, String[]> map = new HashMap<String, String[]>();

BufferedReader file = new BufferedReader(new FileReader("test.txt"));
String str;


while ((str = file.readLine()) != null) { 


    ... logic


    map.put(key, value);



}
System.out.println("number of keys: " + map.size());
for(Entry<String, String[]> entry : map.entrySet()) {
    for(String value : entry.getValue()) {
        System.out.println(entry.getKey() + ": " + value);
    }
}
file.close();

2 个答案:

答案 0 :(得分:5)

您可以尝试以下代码:

public void mapPermute(Map<String, String[]> map, String currentPermutation) {
    String key = map.keySet().iterator().next(); // get the topmost key

    // base case
    if (map.size() == 1) {          
        for (String value : map.get(key)) {
            System.out.println(currentPermutation + key + "=" + value);
        }
    } else {
        // recursive case
        Map<String, String[]> subMap = new HashMap<String, String[]>(map);

        for (String value : subMap.remove(key)) {
            mapPermute(subMap, currentPermutation + key + "=" + value + ", ");
        }
    }
}

无法保证内存效率或速度。如果要保留地图中键的顺序,则必须传入TreeMap并更改代码以在递归情况下使用TreeMap

正如基本情况所示,我假设你的地图中至少有一个条目。

答案 1 :(得分:0)

在我看来,你真的想要MultiMap。特别是,ArrayListMultimap允许重复输入:

ArrayListMultimap<String, String> map = ArrayListMultimap.create();

for each line in file:
   parse key k
   for each value in line:
      parse value v
      map.put(k, v);

for (Map.Entry<String,String> entry : map.entries()) {
   String key = entry.getKey();
   String value = entry.getValue();
}

如果你想要一个地图的笛卡尔积,你可以直接使用递归来计算它,或者你可以迭代地图:创建一个迭代器列表并迭代里程表式;当迭代器N到达其末尾时,推进迭代器N + 1并重置迭代器1..N。


只是戳了一下,发现了这个问题:Iterative Cartesian Product in Java

所以我建议您使用番石榴Sets.cartesianProduct作为笛卡尔积。这是我的代码,你可以适应你的输入逻辑:

    String key1 = "a";
    Set<Integer> values1 = Sets.newLinkedHashSet(Arrays.asList(1, 2, 3, 4 ));
    String key2 = "b";
    Set<Integer> values2 = Sets.newLinkedHashSet(Arrays.asList(5, 6, 7));
    String key3 = "c";
    Set<Integer> values3 = Sets.newLinkedHashSet(Arrays.asList(8, 9));

    List<String> keys = Arrays.asList(key1, key2, key3);
    Set<List<Integer>> product = Sets.cartesianProduct(values1, values2, values3);
    for (List<Integer> values : product) {
        for (int i = 0; i < keys.size(); ++i) {
            String key = keys.get(i);
            int value = values.get(i);
            System.out.print(key + "=" + value + "; ");
        }
        System.out.println();
    }