自从2个小时(我很笨)以来,我一直被这个奇怪的问题困扰。
我有一张值<String,Set>
的地图
A = 1,2,3
B = 4,5
C = 6
我正在寻找的输出是
A = 1&B = 4&C = 6
A = 1&B = 5&C = 6
A = 2&B = 4&C = 6
A = 2&B = 5&C = 6
A = 3&B = 4&C = 6
A = 3&B = 5&C = 6
到目前为止我所做的:
根据第一个键在地图上进行迭代,并将值存储在数组中
遍历第二个键,但是我不确定如何将第一个结果的值合并到此键。
忘记第三个和后续键。
这听起来像是一个非常愚蠢的问题,但我无法弄清楚。我试图避免这种情况到达这里,但我不能改变!
请帮忙。
注意:-我也使用了多集,但它接受了重复的值,因此必须使用一个集,因此以map<String,Set>
结尾。
最佳答案
以下代码可以处理Map的任何大小(空除外),以及每个Set的任何大小(空除外)。空的Map / Set将引发错误。
当然,一旦定义了预期的输出,将代码扩展为处理空应该很简单。
Map<String, Set<String>> map = new LinkedHashMap<>();
map.put("A", new LinkedHashSet<>(Arrays.asList("1", "2", "3")));
map.put("B", new LinkedHashSet<>(Arrays.asList("4", "5")));
map.put("C", new LinkedHashSet<>(Arrays.asList("6")));
List<String> result = null;
for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
String key = (result == null ? "" : "&") + entry.getKey() + "=";
Set<String> values = entry.getValue();
if (values.isEmpty())
throw new IllegalArgumentException("Empty set not supported");
List<String> crossJoin = new ArrayList<>((result == null ? 1 : result.size()) * values.size());
if (result == null)
for (String value : values)
crossJoin.add(key + value);
else
for (String left : result)
for (String value : values)
crossJoin.add(left + key + value);
result = crossJoin;
}
if (result == null)
throw new IllegalArgumentException("Empty map not supported");
for (String value : result)
System.out.println(value);
输出量
A=1&B=4&C=6
A=1&B=5&C=6
A=2&B=4&C=6
A=2&B=5&C=6
A=3&B=4&C=6
A=3&B=5&C=6