繁体   English   中英

递归迭代哈希图

[英]recursive iterate 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();

您可以尝试以下代码:

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

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

在我看来,您确实想要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。


刚戳了一下,发现了一个SO问题: 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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM