Java 递归迭代哈希映射

Java 递归迭代哈希映射,java,recursion,hashmap,Java,Recursion,Hashmap,我想从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[]>(); Bu

我想从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();

在我看来,你真的很想要一个。特别是,允许重复条目:

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

只是随便看看,发现了这个问题:

所以我建议你用番石榴做笛卡尔产品。下面是我的代码,您可以根据自己的输入逻辑进行调整:

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

您可以尝试以下代码:

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 + ", ");
        }
    }
}
不保证内存效率或速度。如果希望保留映射中键的顺序,则必须传入一个树映射,并将代码更改为在递归情况下使用树映射


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

我不清楚:a是您的键,a列表中的3是您的值,还是a列表中的3是您的键,b列表中的5是您的值?a是键,3和4是字符串。因此字符串[]。该值为String[]我不想要重复的条目。我只想要每个k,v组合。我不关心这些值是什么。HashMultimap可以防止重复条目。但我还是不清楚你的目标。我得到一个文本输入。这进入了地图。关键是a。这些值存储在字符串[]中。我以后需要这些值作为单独的字符串。这就是为什么它是String[],而不仅仅是String。我需要在我的第一篇文章中的每一个键值对的组合。在这种情况下,你只需要检查键值对是否已经存在于地图中。我想我刚刚得到了你想要的地图产品,因为这是绝对完美的!一切如愿!非常感谢你!