java - Recursive Table/Row Generator -
i'm having tough time wrapping head around following situation. best way explain may example
i have map<column,set<row>> object. let's contains following data:
columna['abc','def'] columnb['efg','hij','klm'] columnc['nop'] columnd['qrs','tuv','wxy','zzz']
i trying generate following output:
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...
so in case there 24 rows total.
however, number of columns , rows both dynamic. feel needs recursively done somehow i'm not sure start.
any appreciated.
update - made tree structure seems work.
defaultmutabletreenode root = new defaultmutabletreenode(); set<defaultmutabletreenode> curnodes = new hashset<defaultmutabletreenode>(); curnodes.add(root); final set<column> keys = map.keyset(); (final column key : keys) { final set<row> rowset = map.get(key); set<defaultmutabletreenode> tmpnodes = new hashset<defaultmutabletreenode>(); (final row row : rowset) { defaultmutabletreenode curnode = new defaultmutabletreenode(); curnode.setuserobject(row); tmpnodes.add(curnode); (defaultmutabletreenode n : curnodes) { n.add(curnode); } } curnodes = tmpnodes; }
i hope not student's homework.
first keep order of map's keys same, use sortedmap
, treemap
. furthermore in initial map every row contains single value 'abc'. recursion here depth-first traversal. hard thing map has not natural traversal. rest have todos/candidates , dones/result; step changing data , afterwards restore them.
here use more known list, stack nicer.
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 (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 }
Comments
Post a Comment