Ajuda com ArrayList!

Boa tarde pessoal! Estou com um problema meio complicado aqui, mas acredito que seja só questão de lógica! Já tentei resolver mas não to conseguindo, por isso estou recorrendo á comunidade! =D hehe

O contexto é o seguinte, estou querendo inserir na tela de um projeto Web, um componente chamado “Tree”, pra quem não sabe, é aquele que nós usamos para navegar nas pastas do Windows Explorer, com aquele [+] que expande a pasta e tal…bom, o front-end é em Flex, e o Back-end em Java, usando o BlazeDS como ponte…em relação a essa configuração, está tudo certo! Estou trocando vários objetos e consultas entre eles e ta td OK!

Então vamos lá…no flex eu só preciso passar um ArrayCollection pra esse componente “Tree”, que ele se vira, monta os diretórios pais e filhos… só que esse Array tem que estar construido de uma forma especifica, ele tem que conter Array’s dentro de outro Array, um ArrayPai.add(ArrayFilho) teoricamente. E eu to montando esse array no java, e é ai que eu to errando na lógica…

  • Tenho uma tabela chamada Menu no meu banco indicando quem é filho de quem por id, e quem é pai tem o valor do id = 0:

Vou passar a parte da minha classe que traz os diretórios do banco, faz a consulta, e (tenta) trata o Array que irá pro Flex:
*Se precisarem de alguma outra parte do código é só pedir!!

//--Classe MedicoService.java

public ArrayList<Menu> montaTree(){
		ArrayList<Menu> array = new ArrayList<Menu>();
		Connection con = FabricaConexao.getConexao();
		String sql = "select * from menu";
		try{
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while(rs.next()){
				Menu m = new Menu(0,null,null); 
				m.setIdmenu(rs.getInt("idmenu"));
				m.setDescricao((rs.getString("descricao")));
				m.setIdpai(rs.getInt("idpai"));
				array.add(m);
			}
		con.close();
		rs.close();
	}catch(SQLException e){
		e.printStackTrace();
	}
	return array;
	}
	
	//----------------------------------------------Método em que estou com duvida:-----------------
	public ArrayList<Menu> montaMenu(){

		ArrayList<Menu> menu = new ArrayList<Menu>();
		ArrayList<Menu> pai = new ArrayList<Menu>();
		ArrayList<Menu> filho = new ArrayList<Menu>();
		ArrayList<Menu> monta = new ArrayList<Menu>();
		ArrayList<Menu> root= new ArrayList<Menu>();
			
		menu = montaTree();
		
		for(Menu bean : menu) {
			if(bean.getIdpai()==0){
			   pai.add(bean);
			}
			if(bean.getIdpai()!=0){
				filho.add(bean);
			}
		}
		for(Menu p : pai){
			for(Menu f : filho) {
						if(f.getIdpai() == p.getIdmenu()){
						Menu m = new Menu(0,null,null);
						m.setDescricao(f.getDescricao());
						m.setIdmenu(f.getIdmenu());
						monta.add(m);
						root.add(new Menu(p.getIdmenu(),p.getDescricao(),monta));
				}
			}
		}
	return root;
  }

O método montaMenu() que ta errado…a lógica e tal…ele retorna um Array chamado “root” que é o que o flex ta pegando. Preciso de uma força de voces pra desencadear as ideias ai…

Eu criei uma classe “Bean” chamada “Menu” que vai passar no construtor alguns parametros e entre eles o mais importante, um ArrayCollection, pois foi só assim que eu conseguir colocar um dentro de outro…

Seria essa aqui:

public class Menu {

	int idmenu;
	int idpai;
	String descricao;
	ArrayList<Menu> menu;
	
	public Menu(int idpai, String descricao, ArrayList<Menu> menu) {
		super();
		this.idpai = idpai;
		this.descricao = descricao;
		this.menu = menu;
	}
	public int getIdmenu() {
		return idmenu;
	}
	public void setIdmenu(int idmenu) {
		this.idmenu = idmenu;
	}
	public int getIdpai() {
		return idpai;
	}
	public void setIdpai(int idpai) {
		this.idpai = idpai;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
}

Bom…a idéia é fazer o “Tree” funcionar com um ArrayCollection msm, tem como fazer ele no flex usando mas pro meu caso eu preciso mto dele como ArrayCollection vindo do java…

Então galera…onde eu estou errando?

Não sei se eu compliquei as bolas ai, mas basicamente eu separo oque é PAI em um array pai, e o que é FILHO em um array chamado filho…
Depois eu itero os dois em busca da propriedade “idpai” que os objetos do array filho pegaram do Banco …e faço um if comparando ela com a propriedade “idmenu” que os objetos do array pai tbm pegaram do banco…ou seja, o filho sabe quem é o pai…
quando elas se batem eu crio um array chamado MONTA que pega o que eu quero do filho…e mando ele dentro do array final chamado ROOT …que vai pro Flex…

acontece que quando o flex pega esse array, ele imprime várias vezes o diretório “Arquivos” e 1 vez o “Arquivos2” que são descricoes dos menus que eu peguei do banco…ou seja…fica td zuado…

eu debuguei no eclipse e vi que realmente ele repete alguns registros …mas era pra aparecer todos…principalmente os filhos…x
Não sei aonde estou errando…

up!! Kd o vinny!!!?? eahehah

Eu? Tô lendo seu post… é muito texto. E, olha, upar tópico é falta de educação. Quanto mais menos de meia hora depois de posta-lo.

Em algum lugar aí não tinha que ter um ArrayList<ArrayList<Menu>> ? Pq não vi nenhum…

Desculpa pelo up forçado ai! Mas é que meu ultimo tópico desceu lá pra baixo, e eu só fiquei olhando…e até hoje ele descansa em paz nas profundezas desse fórum…
E esse problema eu to com um pouco de urgencia…
Mas então Vini, eu tenho que passar uma String “descricao” um int “idmenu” do diretório, e um arrayList pra cada pai e filho…por isso eu fiz esse seu ArrayList<ArrayList> dentro do construtor da minha classe Menu…
Lá eu passo um ArrayList como argumento…
Como seria a outra forma?

Eai galera??? mais ngm pode dar uma idéia?

Ta deve estar muito complicado esse texto, ou muito mau explicado…

Vou passar como eu faço no Flex, e voces me dizem como eu faço no Java, pode ser?

no flex a criação de um Array dentro de outro (dando “new”, ou seja criando outro array por argumento) ficaria assim:

private var menu:Menu; //criei um "objeto" do tipo da minha classe Menu! 

				private var arrayExemplo:ArrayCollection = new ArrayCollection([
					new Menu(menu.idmenu,menu.descricao, new ArrayCollection([
						new Menu(menu.idmenu,menu.descricao, new ArrayCollection([
							new Menu(menu.idmenu,menu.descricao,null),
							new Menu(menu.idmenu,menu.descricao,null),
							new Menu(menu.idmenu,menu.descricao,null)]))]))]);

Ficou mais fácil?

Putz, saquei. Mas aparentemente você está fazendo certo em Java. Deve ser alguma peculiaridade da API que você está usando. Como não a conheço fica difícil ajudar. =/

Quando eu debugo ele tem um comportamento mto estranho…não consigo entender…
antes de terminar o primeiro “foreach” que separa quem é pai e quem é filho:

 for(Menu bean : menu) {  
        if(bean.getIdpai()==0){  
           pai.add(bean);  
             }  
             if(bean.getIdpai()!=0){  
                 filho.add(bean);  
             }  
       }  

Ele já sai do loop e começa a pegar outros objetos logo abaixo…mto esquisito…
Dai ele fica indo e voltando desse for…mesmo depois de eu já ter finalizado ele com o “}”…sabe o pq disso vini?

Galera, ainda não resolvi essa zica ai! Alguem tem alguma idéia alternativa?

É difícil te ajudar pq aparentemente é algo da biblioteca que você está usando. =(