首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Map<Object、List<Object>>组合

Map<Object、List<Object>>组合
EN

Stack Overflow用户
提问于 2017-06-06 13:07:09
回答 1查看 517关注 0票数 4

我有一个包含示例数据的HashMap<GC, List<RR>>,如:

代码语言:javascript
复制
key   values

gc1 - rr1
    - rr2
    - rr3

gc2 - rr4
    - rr5

gc3 - rr6

我需要从不同的GC中创建所有可能的RR组合,例如:

代码语言:javascript
复制
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>>,然后遍历以下所有元素:

代码语言:javascript
复制
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分组如下:

代码语言:javascript
复制
Combination1: rr1, rr2, rr3
Combination2: rr4, rr5
Combination3: rr6

因此,我的问题是,我如何调整我的代码以获得预期的结果?

PS:不幸的是,我正在使用Java6,所以不允许使用lambdas/streams。

PS2:我见过类似的问题,但找不到我要找的东西的确切例子。

编辑:

这是我最后的实现,@nandsito的回答是:

代码语言:javascript
复制
//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);

}
EN

回答 1

Stack Overflow用户

发布于 2017-06-06 16:37:40

您真正需要做的就是处理一个递增的索引列表:

代码语言:javascript
复制
0,0,0
0,1,0
1,0,0
1,1,0
2,0,0
... etc.

如何将每一行转换为数据结构中的值应该是显而易见的。例如,0,0,0映射到rr1, rr4, rr6。这将涉及到将映射转换为列表,以便索引是一致的。

它非常类似于一个普通的基-b计数,在这个计数中,增加最右边的列,如果它溢出,设置为零,并增加下一个列。唯一的区别是每一列都有不同的数目溢出。

所以:

代码语言:javascript
复制
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(),但是应该非常清楚如何做到这一点。

然后:

代码语言:javascript
复制
int[] indexes = new int[mapsize];
do {
    output(translate(map, indexes));
} while (increment(indexes));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44390843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档