我想从散列图中检索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();
答案 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();
}