【问题标题】:Recursive Table/Row Generator递归表/行生成器
【发布时间】:2011-10-09 01:31:59
【问题描述】:

我很难理解以下情况。最好的解释方式可能是举例

我有一个 Map> 对象。 假设它包含以下数据:

ColumnA['abc','def']
ColumnB['efg','hij','klm']
ColumnC['nop']
ColumnD['qrs','tuv','wxy','zzz']

我正在尝试生成以下输出:

Row1[abc,efg,nop,qrs]
Row2[abc,efg,nop,tuv]
Row3[abc,efg,nop,wxy]
Row4[abc,efg,nop,zzz]
Row5[abc,hij,nop,qrs]
Row6[abc,hij,nop,wxy]
etc...

所以在这种情况下,总共会有 24 行。

但是,列数和行数都是动态的。我觉得这需要以某种方式递归完成,但我不确定从哪里开始。

任何帮助将不胜感激。

更新 - 我制作了一个似乎可以工作的树结构。

    DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    Set<DefaultMutableTreeNode> curNodes = new HashSet<DefaultMutableTreeNode>();
    curNodes.add(root);

    final Set<Column> keys = map.keySet();
    for (final Column key : keys) {
        final Set<Row> rowSet = map.get(key);
        Set<DefaultMutableTreeNode> tmpNodes = new HashSet<DefaultMutableTreeNode>();
        for (final Row row : rowSet) {
            DefaultMutableTreeNode curNode = new DefaultMutableTreeNode();
            curNode.setUserObject(row);
            tmpNodes.add(curNode);
            for (DefaultMutableTreeNode n : curNodes) {
                n.add(curNode);
            }
        }
        curNodes = tmpNodes;
    }

【问题讨论】:

  • 也许从这种结构中创建一棵树更有意义,其中每一列都代表一个树级别?

标签: java arrays recursion matrix


【解决方案1】:

我希望这不是一些学生的作业。

首先要保持地图键的顺序相同,请使用SortedMap,例如TreeMap。 此外,在您的初始地图中,每一行仅包含一个值,例如“abc”。 这里的递归是深度优先遍历。困难的是地图没有 自然穿越。其余的有待办事项/候选人和完成/结果;一步更改数据,然后恢复它们。

这里我使用的是比较知名的 List,不过 Stack 会更好。

public List<Row> generateRows(SortedMap<Column, Set<Cell>> map) {
    List<Row> done = new ArrayList<Row>();
    List<Column> columnsToDo = new LinkedList<Column>(map.keySet());
    List<Cell> partialRow = new LinkedList<Cell>();
    generateRowsRec(map, columnsToDo, partialRow, done);
    return done;
}
void generateRowsRec(SortedMap<Column, Set<Cell>> map, List<Column> columnsToDo, List<Cell> partialRow, List<Row> done) {
    if (columnsToDo.isEmpty()) {
        done.add(new Row(partialRow));
        return;
    }
    Column firstColumn = columnsToDo.remove(0); // Step A
    for (Cell cell : map.get(firstColumn)) {
        partialRow.add(cell); // Step B
        generateRowsRec(map, columnsToDo, partialRow, done);
        partialRow.remove(partialRow.size() - 1); // Unstep B
    }
    columnsToDo.add(0, firstColumn); // Unstep A
}

【讨论】:

  • 不,这不是家庭作业。我已经建立了一棵树,它似乎把所有东西都按正确的顺序排列了。我会发布我到目前为止所拥有的。但是,我也想尝试一下,看看效果如何。我很好奇两者在高负载(很多值)下的表现如何。我非常感谢您提供的见解和示例。
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 2018-11-06
  • 2019-08-25
  • 2021-05-22
  • 2020-08-04
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多