Java 递归迭代哈希映射
我想从hashmap中检索k,v-对。 入口是这样的: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
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。我需要在我的第一篇文章中的每一个键值对的组合。在这种情况下,你只需要检查键值对是否已经存在于地图中。我想我刚刚得到了你想要的地图产品,因为这是绝对完美的!一切如愿!非常感谢你!