Ajuda na logíca para imprimir dados

Galera,
estou com uma missão que não consigo resolver…tenho a seguinte metodo

minha lista

public ArrayList<Menu> select()throws Exception{ ArrayList<Menu> lista = new ArrayList<Menu>(); String sql = "select * from menu "; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); Menu menu = null; while(rs.next()){ menu = new Menu(); menu.setId((rs.getInt("ID"))); menu.setNome((rs.getString("Nome"))); menu.setAction(rs.getString("Action")); menu.setPai(rs.getInt("Pai")); lista.add(menu); } rs.close(); return lista; }

meu metodo para imprimir os dados

[code]public ArrayList organizarMenu ( List lista, int pai){

	for(Menu m: lista){
	//	System.out.println("For");
		if(m.getPai() == pai){
			System.out.println(+m.getId()+" menu:"+ m.getNome()+ " " + m.getPai());			
			organizarMenu(lista,m.getId());
		}
	}
	
	return null;
	
}[/code]

preciso montar da seguinte forma:
no meu banco tenho o ID| MENU| PAI

sempre que o pai for igual ao ID quer dizer que é um submenu, essa lógica já está feita no metodo acíma, porém preciso que imprima no formato html…que fique assim:

<ul> <li>Home</li> <li>Concessionarias <ul> <li>Fiat <ul> <li>Uno</li> </ul> </li> <li>Gm <ul> <li>camaro</li> </ul> <ul> <li>Produtos</li> <li>about

    Alguém tem alguma luz ai pra me ajudar??

UP!

Não faça isso colega, seu tópico não é mais importante do que os outros.
Que tecnologia web está utilizando? É Servlet e JSP?

Desculpe Nel…

Agora estou usando apenas uma classe java para teste mesmo, pois preciso da lógica para imprimir nesse formato para estruturar um menu para utilizar depois no JSP.

Meu metodo já está imprimindo na ordem necessário porém preciso que imprima o script tbm.

bom seu eu entendi é isso que vc ker

System.out.println(sql);

se não for pq eu não entendi sua questão …

abrxx

Vou tentar explicar melhor minha consulta da forma que está imprimi assim:

id| menu| Pai
1 home 0
2 concessionário 0
3 FIat 2
4 UNO 3
5 GM 2

ou seja Home e Concessionário é menu pois a coluna PAI não é igual a nenhum ID
Fiat é um concessionário logo seu PAI é = 2 ( submenu de concessionário )
UNo é um carro da fiat, logo seu paí é igual a 3 ( submenu de Fiat )
GM é um concessionário logo seu PAI é = 2 ( submenu de concessionário )

etc…

Essa lógica já está criada dó que ele imprime assim.

home
concessionário
FIat
UNO
GM

só que preciso adicionar script de html na hora de imprimir preciso que esse seja impresso assim

  • Home
  • Concessionarias
    • Fiat
      • Uno
    • Gm
      • camaro

    Certo.

    E isso você vai fazer via writer no seu JSP para imprimir no response, é isso?
    Se for, podes montar a String usando o StringBuffer, entende?

    sim nel,
    porém gostaria de visualizar isso ( aestrutura montada ) antes pelo System.out.println() nessa minha classe de teste antes de ir para o jsp.

    acho que devo usar um condição if, mais não consegui achar a logíca certa ainda no metodo abaixo.

    for(Menu m: lista){ // System.out.println("For"); if(m.getPai() == pai){ System.out.println(+m.getId()+" menu:"+ m.getNome()+ " " + m.getPai()); organizarMenu(lista,m.getId()); } }

    [quote=FernandoCps]sim nel,
    porém gostaria de visualizar isso ( aestrutura montada ) antes pelo System.out.println() nessa minha classe de teste antes de ir para o jsp.

    acho que devo usar um condição if, mais não consegui achar a logíca certa ainda no metodo abaixo.

    for(Menu m: lista){ // System.out.println("For"); if(m.getPai() == pai){ System.out.println(+m.getId()+" menu:"+ m.getNome()+ " " + m.getPai()); organizarMenu(lista,m.getId()); } } [/quote]

    Possivelmente terá de usar alguma condição para montar a String. Mas não concatene String dentro de um for com o ‘+’, é muito ruim!
    Não vou entrar em detalhes, mas use o StringBuffer ou o StringBuilder para montar tua saída e ao fim mande imprimir, para ver se fica como quer.

    Caso não consiga, coloque seu algoritmo aqui que ajudamos você! :smiley:

    pq vc nao executa um select retornando as colunas que voce precisa

    select id,nome,pai from tabela 

    [quote=lineofgol]pq vc nao executa um select retornando as colunas que voce precisa

    select id,nome,pai from tabela [/quote]

    Ao que eu entendi, ele já possui estes valores. O que ele simplesmente não está conseguindo é “edentar” esses valores em uma String no formato HTML como ele deseja.

    private static StringBuilder toHtmlString(List<Menu> list, int pai){
        StringBuilder result = new StringBuilder();                
        boolean exist = false;
        for (Menu m:list){
                if(m.getPai() == pai){
                    if (!exist){
                        result.append("<ul>");
                        exist = true;
                    } 
                    result.append("<li>").append(m.getNome());
                    result.append(toHtmlString(list,m.getId()));
                    result.append("</li>");  
                }  
        }   
        if (exist){
                result.append("</ul>");
        }
            return result; 
    }
    

    Atenção que este forma é muito ineficiente, principalmente se a lista for grande. Nesse caso deves considerar utilizar outra estrutura que não um ArrayList após obter os dados da BD.

    coloca dentro de um table

    [quote=pmlm][code]
    private static StringBuilder toHtmlString(List list, int pai){
    StringBuilder result = new StringBuilder();
    boolean exist = false;
    for (Menu m:list){
    if(m.getPai() == pai){
    if (!exist){
    result.append("

      ");
      exist = true;
      }
      result.append("
    • ").append(m.getNome());
      result.append(toHtmlString(list,m.getId()));
      result.append("
    • ");
      }
      }
      if (exist){
      result.append("
    ");
    }
    return result;
    }

    [/code]

    Atenção que este forma é muito ineficiente, principalmente se a lista for grande. Nesse caso deves considerar utilizar outra estrutura que não um ArrayList após obter os dados da BD.[/quote]

    pmlm,
    Acredito que isso vá funcionar porkém não estou conseguindo fazer o teste no meu metodo Main, estava usando assim.

    Menu menu = new Menu(); MenuDao cdao = new MenuDao(conn); ArrayList<Menu> lista = new ArrayList<Menu>(); lista = cdao.select(); // Aqui é o metodo que seleciona todos os dados do banco cdao.organizaMenu(lista,0);

    tendei um cdao.toHtmlString(lista,1); porém não está funcionando.

    Como utilizo esse metodo?

    Baseei no teu exemplo. Usa com 0

        cdao.toHtmlString(lista,0);  

    O estranho que se eu inicio o Pai com 0 ( zero )

    cdao.toHtmlString(lista,0);

    ele me retorna um erro: :56 le leva até o For do metodo.

    Exception in thread "main" java.lang.StackOverFlowError at java.util.AbstractList$Itr.next(Unknown Source) at Metodos.Dao.Menu.Dao.ToHtmlString(MenuDao.java:56)

    Qual é o tamanho da tua lista?

    Eu testei assim:

    import java.util.List;
    import java.util.ArrayList;
    
    
    class Menu{
        private int id;
        private String nome;
        private int pai;
        
        Menu(int id, String nome, int pai){
            this.id = id;
            this.nome = nome;
            this.pai = pai;
        }
        
        public int getId(){ return id;}
        public int getPai(){ return pai;}
        public String getNome(){ return nome;}
    }
    
    public class Test1{
        public static void main (String args[]){
            
            List<Menu> list = new ArrayList<Menu>();
            list.add(new Menu(1, "home", 0));
            list.add(new Menu(2, "concessionário", 0));
            list.add(new Menu(3, "Fiat", 2));
            list.add(new Menu(4, "Uno", 3));
            list.add(new Menu(5, "GM", 2));
            
            System.out.println(toHtmlString (list, 0));
        }
        
        private static StringBuilder toHtmlString(List<Menu> list, int pai){
            StringBuilder result = new StringBuilder();                
            boolean exist = false;
            for (Menu m:list){
                if(m.getPai() == pai){
                    if (!exist){
                        result.append("<ul>");
                        exist = true;
                    } 
                    result.append("<li>").append(m.getNome());
                    result.append(toHtmlString(list,m.getId()));
                    result.append("</li>");  
                }  
            }   
            if (exist){
                result.append("</ul>");
            }
            return result; 
        }
    }

    Como disse atrás, se a tua lista for muito grande deves pensar em utilizar outra estrutura de dados que não uma simples lista.

    A minha lista que vem do banco tem exatamente só essas informações do seu exemplo…
    com o seu exemplo funcionou, talvez o problema esteja na minha lista…vou ver se acho o erro.

    vlw…

    Vê se não tens algum registo que seja pai dele próprio.

    Vou dar uma sugestão quanto a lógica:

    Crie (o melhor seria depois que fizer a consulta, com o resultado dela), um conjunto com os níveis “pai”, esse conjunto, deverá conter dentro de cada posição, o nível pai e um outro conjunto, com os níveis filho dele. Dessa forma, você itera pelo conjunto pai, e os conjuntos filhos são os ítens de menu desse conjunto pai.