A unica coisa que posso dizer pra te ajudar é que com o pattern Visitor o teu código vai ficar bem mais simples e organizado.
gomesrod
Se fosse cada pai referenciando os filhos seria fácil, basta uma busca em largura simples…
Mas pelo que você disse o filho é que referencia o pai?
phlopes
Isso, na verdade cada filho tem o id do pai, o pai no nível maior não tem id nenhum.
gomesrod
É, isso complica bastante…
Na API não tem nada pronto para tratar esse tipo de estrutura, pensei em duas soluções que possam servir ao seu caso mas cada uma tem um pequeno “probleminha”
Varrer todos esses registros e organiza-los em uma estrutura tipo árvore em que cada pai tem uma collection de filhos. Fazer o que você precisa nesse tipo de estrutura ficaria mais simples (só corrigindo, ao contrário do que eu disse antes, a busca em largura não iria funcionar, me enganei :oops:).
Problema: A performance seria completamente horrível.
Fazer um sort nesses registros, implementando algum esquema de comparação que leve em conta os pais para fazer com que o resultado saia da maneira desejada.
Problema: Não tive como pensar a fundo nessa solução, não tenho 100% de certeza que é possível de implementar.
Devem existir soluções melhores, vamos esperar um pouco e ver se aparece mais alguém para ajudar. Tem uns experts em algoritmo aqui no fórum, quem sabe dão uma passadinha.
Se não rolar novas idéias e você quiser tentar uma dessas soluções aí podemos detalhar mais.
maschiojv
Como eu disse, usando o pattern Visitor fica bem simples, se bem que aqui eh um visitor meio falcatrua:
publicclassMain{publicstaticvoidmain(String[]args){//todas as categiorias, como venho do bancoCollection<Categoria>todas=newArrayList<Categoria>();Categoriaele=newCategoria("Eletrodomésticos");todas.add(ele);Categoriacoz=newCategoria("Cozinha",ele);todas.add(coz);Categoriamic=newCategoria("Microondas",coz);todas.add(mic);Categoriabra=newCategoria("Brastemp",mic);todas.add(bra);Categoriaphi=newCategoria("Philips ",mic);todas.add(phi);Categoriaban=newCategoria("Banho");todas.add(ban);Categoriatoa=newCategoria("Toalhas",ban);todas.add(toa);Categoriaalg=newCategoria("Algodão",toa);todas.add(alg);for(Categoriacategoria:todas){if(categoria.getParent()!=null){StringBuildersb=newStringBuilder();categoria.print(sb);System.out.println(sb);}}}}
Acho que nós estamos pensando em partes diferentes do problema!
Você mostrou a solução para imprimir cada Categoria, enquanto eu estava preocupado em como ordená-las.
maschiojv
gomesrod:
maschiojv:
...
Acho que nós estamos pensando em partes diferentes do problema! :)
Você mostrou a solução para imprimir cada Categoria, enquanto eu estava preocupado em como ordená-las.
Acho que agora ordenar é só uma evoluçãozinha da idéia, por exemplo:
publicclassMain{publicstaticvoidmain(String[]args){//todas as categiorias, como venho do banco, e um HashSet (desordenado) Collection<Categoria>todas=newHashSet<Categoria>();Categoriaele=newCategoria("Eletrodomésticos");todas.add(ele);Categoriacoz=newCategoria("Cozinha",ele);todas.add(coz);Categoriamic=newCategoria("Microondas",coz);todas.add(mic);Categoriabra=newCategoria("Brastemp",mic);todas.add(bra);Categoriaphi=newCategoria("Philips ",mic);todas.add(phi);Categoriaban=newCategoria("Banho");todas.add(ban);Categoriatoa=newCategoria("Toalhas",ban);todas.add(toa);Categoriaalg=newCategoria("Algodão",toa);todas.add(alg);List<Nivel>niveis=newArrayList<Nivel>();for(Categoriacategoria:todas){if(categoria.getParent()!=null){Nivelnivel=newNivel();categoria.visit(nivel);niveis.add(nivel);}}Collections.sort(niveis);for(Nivelnivel:niveis){System.out.println(nivel);}}}