我有一个包含示例数据的HashMap<GC, List<RR>>,如:
key values
gc1 - rr1
- rr2
- rr3
gc2 - rr4
- rr5
gc3 - rr6我需要从不同的GC中创建所有可能的RR组合,例如:
Combination1: rr1, rr4, rr6
Combination2: rr1, rr5, rr6
Combination3: rr2, rr4, rr6
Combination4: rr2, rr5, rr6
Combination5: rr3, rr4, rr6
Combination6: rr3, rr5, rr6正如@Sanket所建议的,到目前为止,我尝试的是将我的HashMap<GC, List<RR>>转换为List<List<RR>>,然后遍历以下所有元素:
List<List<RR>> inputList = new ArrayList<List<RR>>();
for (Map.Entry<GC, List<RR>> rrList : Map.entrySet()) {
inputList.add(rrList.getValue());
}
List<List<RR>> combinationsList = new ArrayList<List<RR>>();
for (List<RR> rrList : inputList) {
List<RR> rrList1 = new ArrayList<RR>();
for (RR rr : rrList) {
rrList1.add(rr);
}
combinationsList.add(rrList1);
}这并不适用于我,因为它将一个GC中的所有RR分组如下:
Combination1: rr1, rr2, rr3
Combination2: rr4, rr5
Combination3: rr6因此,我的问题是,我如何调整我的代码以获得预期的结果?
PS:不幸的是,我正在使用Java6,所以不允许使用lambdas/streams。
PS2:我见过类似的问题,但找不到我要找的东西的确切例子。
编辑:
这是我最后的实现,@nandsito的回答是:
//this method groups RRs by GC key with a given list
HashMap<GC, List<RR>> GCRRHashMap = groupRRsByGC(list);
List<Map.Entry<GC, List<RR>>> mapEntryList = new ArrayList<Map.Entry<GC, List<RR>>>(GCRRHashMap.entrySet());
List<List<RR>> combinationsList = new ArrayList<List<RR>>();
List<RR> combinations = new ArrayList<RR>();
generateCombinations(mapEntryList, combinations, combinationsList);
private void generateCombinations(
List<Map.Entry<GC, List<RR>>> mapEntryList,
List<RR> combinations, List<List<RR>> combinationsList) {
if (mapEntryList.isEmpty()) {
combinationsList.add(new ArrayList<RoomStay>(combinations));
return;
}
Map.Entry<GC, List<RR>> entry = mapEntryList.remove(0);
List<RR> entryValue = new ArrayList<RR>(entry.getValue());
while (!entryValue.isEmpty()) {
RR rr = entryValue.remove(0);
combinations.add(rr);
generateCombinations(mapEntryList, combinations, combinationsList);
combinations.remove(combinations.size() - 1);
}
mapEntryList.add(0, entry);
}发布于 2017-06-06 16:37:40
您真正需要做的就是处理一个递增的索引列表:
0,0,0
0,1,0
1,0,0
1,1,0
2,0,0
... etc.如何将每一行转换为数据结构中的值应该是显而易见的。例如,0,0,0映射到rr1, rr4, rr6。这将涉及到将映射转换为列表,以便索引是一致的。
它非常类似于一个普通的基-b计数,在这个计数中,增加最右边的列,如果它溢出,设置为零,并增加下一个列。唯一的区别是每一列都有不同的数目溢出。
所以:
boolean increment(int[] indexes) {
int column = 0;
while(true) {
indexes[column]++;
if(indexes[column] < numberOfRRsInColumn(column)) {
return true; // finished
}
indexes[column]=0;
column++;
if(column = indexes.length) {
return false; // can't increment, no more.
}
}
}这个实现使用indexes[0]作为“最右边”列。我已经忽略了numberOfRRsInColumn(),但是应该非常清楚如何做到这一点。
然后:
int[] indexes = new int[mapsize];
do {
output(translate(map, indexes));
} while (increment(indexes));https://stackoverflow.com/questions/44390843
复制相似问题