[英]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.