Dúvida com ArrayList

10 respostas
L

Boa noite, já consultei diversos tópicos antes de criar este mas não encontrei solução, é o seguinte, preciso criar um sistema onde serão necessários 3 arrayslists um dentro do outro, é como um guarda roupa, terei 3 guardas roupas, cada um com 5 portas, e cada porta com diversos itens que serão inclusos/alterados e deletados pelo usuário.
Minha dúvida é como criar uma lista dentro da outra, segue:

public class metodos {

	ArrayList<String> guarda_roupas = new ArrayList<String>();
    	ArrayList<String> portas = new ArrayList<String>();
    	ArrayList<String> itens = new ArrayList<String>();
    	
    public metodos() {
    	
    	guarda_roupas.add("1");
    	guarda_roupas.add("2");
    	guarda_roupas.add("3");
   	
    }

eu quero saber como faço pra adicionar no guarda_roupa "1" as 5 portas, acredito que seja bem simples mas não encontro em lugar algum.
grato desde já.

10 Respostas

renanjp

Saudações companheiro…

Aqui está um exemplo de array lists alinhados, porém há estruturas mais adequadas para esta operação como o hash map que é orientado a (chave, valor)…
Espero que te ajude nos estudos…

import java.util.ArrayList;
import java.util.Arrays;

public class Teste {
	public static void main(String[] args) {
		
		// criando guarda roupa
		ArrayList<ArrayList<String>> guardaRoupa = new ArrayList<ArrayList<String>>();
		
		// Adicionando portas
		guardaRoupa.add(new ArrayList<String>()); 
		guardaRoupa.add(new ArrayList<String>());
		guardaRoupa.add(new ArrayList<String>());
		guardaRoupa.add(new ArrayList<String>());
		
		// Exemplo de roupas
		String[] tipoDeRoupas = {"CUECA", "CAMISETA", "CALSA", "BERMUDA"};
		int x = 0;
		
		// add 5 roupas em cada guarda roupa
		for (ArrayList<String> porta : guardaRoupa) {
			for (int i = 0; i < 5; i++) {
				porta.add(tipoDeRoupas[x] + " " + (i + 1));
			}
			x++;
		} 
		
		int y = 0;
		// imprimindo
		for (ArrayList<String> porta : guardaRoupa) {
			y++;
			System.out.println("Porta " + y + " possui:");
			System.out.println(Arrays.toString(porta.toArray()));
		} 
	}
}

Att

nel

leandrociscar, quando leio algo como

serão necessários 3 arrayslists um dentro do outro
me preocupa. Não enxergo um modelo onde isso se faça necessário, mas pode ser que haja. Para o seu caso em questão, meu ponto de vista é que está lhe faltando o uso de OO (Orientação á Objeto). Se você criar uma classe simples, tendo um identificador para o seu guarda-roupa, a quantidade de portas e os itens desse guarda-roupa, não fica mais legível e coerente o código ?

Posteriormente, tu podes ter uma única lista dessa classe, que é a representação do seu guarda-roupa. Pense nisso.
Abraços.

Luan_Kevin

Dá uma pesquisada em agregação!

aqui vai um link que fala sobre isso

http://marcosvinicius.greenbeans.com.br/arquivos/NINJA/Treinamento%20NINJA%20-%20Aula07.pdf

espero que ajude! :thumbup:

rmendes08

nel:
leandrociscar, quando leio algo como
serão necessários 3 arrayslists um dentro do outro
me preocupa. Não enxergo um modelo onde isso se faça necessário, mas pode ser que haja. Para o seu caso em questão, meu ponto de vista é que está lhe faltando o uso de OO (Orientação á Objeto). Se você criar uma classe simples, tendo um identificador para o seu guarda-roupa, a quantidade de portas e os itens desse guarda-roupa, não fica mais legível e coerente o código ?

Posteriormente, tu podes ter uma única lista dessa classe, que é a representação do seu guarda-roupa. Pense nisso.
Abraços.

++

Pare de sofrer hoje mesmo irmão, venha para a Igreja Mundial da Orientação a Objetos e crie classes específicas para cada uma das entidades do seu domínio:

class GuardaRoupa{
   private List<Porta> portas;
   //...
}

class Porta{
   private List<ItemRoupa> itens;
   //..
}

class ItemRoupa{
    private TipoRoupa tipo;
    //...
}
L

valeu todo mundo pelas dicas, comecei a estudar o conceito de oo, e criei um novo arquivo metodos.java

mas agora com a ideia de que serão 3 armarios, cada um com 3 gavetas e cada gaveta com X pastas que serão adicionadas/alteradas/exclusas pelo usuário com "nome" e "dados".
Criei a estrutura

public metodos() {
    	
    	class Pasta{
    		String nome;
    		String dados;
    	}
    	
    	class Gaveta{
    		String nome;
    		ArrayList<Pasta> pastas;
    	}
    	
    	class Armario{
    		String nome;
    		
    		ArrayList<Gaveta> gavetas;
			
		Gaveta gaveta1 = new Gaveta();
    		Gaveta gaveta2 = new Gaveta();
    		Gaveta gaveta3 = new Gaveta();
    	}
    		
       }

Agora os ármarios eu não estou conseguindo cria-los dentro do meu arquivo principal, ele não encontra a classe Armario, mesmo no principal já estar com "extends metodos".
E só para confirmar do jeito que fiz a estrutura, as gavetas já estão criadas dentro do Armario?eu acredito que sim, mas não tenho certeza.

nel

Primeiro de tudo, classes sempre iniciam com letra maiúscula.
Você está usando o conceito de inner class e isso só vai te atrapalhar.

Crie uma classe para cada necessidade e na sua classe principal você instancia os objetos de acordo com a tua necessidade. Algo do tipo:

public static void main(String... args) {
    Armario armario = new Armario();
    Porta portas = new Porta();
    Item item = new Item();
}

Conseguiu captar a ideia ?

L

fiz o seguinte, criei um arquivo para cada classe, segue:

public class Armarios {

    public Armarios() {
    	
    	String nome;
    		
    	ArrayList<Gavetas> gavetas;
	Gavetas gaveta1 = new Gavetas();
    	Gavetas gaveta2 = new Gavetas();
    	Gavetas gaveta3 = new Gavetas();
    }
    
    
}
public class Gavetas {

    public Gavetas() {
    	
    	String nome;
    	ArrayList<Pastas> pastas;
    }
    
    
}
public class Pastas {

    public Pastas() {
    	
    	String nome;
    	String dados;
    }
        
}
public static void main(String[] args) {
    	
    	Armarios armario1 = new Armarios();
                Armarios armario2 = new Armarios();
                Armarios armario3 = new Armarios();
                               
    }

Até agora deu tudo certo, consegui criar os 3 armarios, como faço para saber se as 3 gavetas já estão inclusas dentro de cada ármario?
caso já estejam como faço para atribuir uma pasta com 2 atributos na gaveta?só sei com um através do .add no array, mas como agora estou mexendo com objetos não sei como fazer é a mesma coisa?

rmendes08

Em cada uma das suas classes você deve oferencer métodos que permitam manipular os dados da classe, por exemplo, para adicionar uma Gaveta em um armário:

public class Armario{
   private List<Gaveta> gavetas = new ArrayList<>();
   //...
   public void addGaveta(Gaveta g){
      gavetas.add(g);
   }
}

Além do mais, você precisa prestar mais atenção no que você está fazendo. Você está declarando todas as suas variáveis dentro do construtor da classe, isso não funciona pois quando o construtor terminar de executar você vai perder as variáveis.

L

pow cara valeu abriu meus olhos agora, tava vacilando x.x

agora já tenho 3 ármarios criados com 3 gavetas diferente cada um.

public static void main(String[] args) {
    	
    	Armarios armario1 = new Armarios();
        Armarios armario2 = new Armarios();
        Armarios armario3 = new Armarios();
        
        Gavetas gaveta1 = new Gavetas();
    	Gavetas gaveta2 = new Gavetas();
    	Gavetas gaveta3 = new Gavetas();
    	Gavetas gaveta4 = new Gavetas();
    	Gavetas gaveta5 = new Gavetas();
    	Gavetas gaveta6 = new Gavetas();
    	Gavetas gaveta7 = new Gavetas();
    	Gavetas gaveta8 = new Gavetas();
    	Gavetas gaveta9 = new Gavetas();
        
        armario1.addGaveta(gaveta1);
        armario1.addGaveta(gaveta2);
        armario1.addGaveta(gaveta3);
        
        armario2.addGaveta(gaveta4);
        armario2.addGaveta(gaveta5);
        armario2.addGaveta(gaveta6);
        
        armario3.addGaveta(gaveta7);
        armario3.addGaveta(gaveta8);
        armario3.addGaveta(gaveta9);
        
                                     
    }

agora minha dúvida é como passar para o usuário para adicionar na gaveta as pastas...tipo eu pensei em solicitar o nome do ármario e o nome da gaveta e assim adicionar a pasta, porém ela tem duas váriaveis, estou perdido em como transformar num objeto esses duas variáveis e jogar na gaveta...pode me dar uma luz por favor?

eu criei em dentro de Gavetas o código:

public void addPasta(Pastas g){   
    pastas.add(g);
    }

gostaria de pedir ao usuário por JOptionPane, desde já agradeço.

W
leandrociscar:
pow cara valeu abriu meus olhos agora, tava vacilando x.x

agora já tenho 3 ármarios criados com 3 gavetas diferente cada um.

public static void main(String[] args) {
    	
    	Armarios armario1 = new Armarios();
        Armarios armario2 = new Armarios();
        Armarios armario3 = new Armarios();
        
        Gavetas gaveta1 = new Gavetas();
    	Gavetas gaveta2 = new Gavetas();
    	Gavetas gaveta3 = new Gavetas();
    	Gavetas gaveta4 = new Gavetas();
    	Gavetas gaveta5 = new Gavetas();
    	Gavetas gaveta6 = new Gavetas();
    	Gavetas gaveta7 = new Gavetas();
    	Gavetas gaveta8 = new Gavetas();
    	Gavetas gaveta9 = new Gavetas();
        
        armario1.addGaveta(gaveta1);
        armario1.addGaveta(gaveta2);
        armario1.addGaveta(gaveta3);
        
        armario2.addGaveta(gaveta4);
        armario2.addGaveta(gaveta5);
        armario2.addGaveta(gaveta6);
        
        armario3.addGaveta(gaveta7);
        armario3.addGaveta(gaveta8);
        armario3.addGaveta(gaveta9);
        
                                     
    }

agora minha dúvida é como passar para o usuário para adicionar na gaveta as pastas...tipo eu pensei em solicitar o nome do ármario e o nome da gaveta e assim adicionar a pasta, porém ela tem duas váriaveis, estou perdido em como transformar num objeto esses duas variáveis e jogar na gaveta...pode me dar uma luz por favor?

eu criei em dentro de Gavetas o código:

public void addPasta(Pastas g){   
    pastas.add(g);
    }

gostaria de pedir ao usuário por JOptionPane, desde já agradeço.

Você ainda não está pensando na filosofia de OO, você está utilizando várias variáveis sem nenhuma ligação.

Veja:
public static void main(String[] args) {
    	
    	List<Armarios> armarios = new ArrayList<Armarios>();

    	for(int i=0; i<3; i++) {
    	    	armarios.add(i, new Armarios());
    	    	for(int j=0; j<3; j++)
    	    	    	armarios.get(i).addGaveta(new Gavetas());
    	}                               
}
Para adicionar em uma determinada gaveta, você deverá fazer algo como:
Armarios armario = armarios.get(X);
armario.getGaveta(Y).addPasta(new Pastas());
X -> número do armário (começando de zero) Y -> número da gaveta (começando de zero)

Caso você não saiba qual o número de cada objeto, faça um método onde você passará uma String (nome) e ele retornará a posição do objeto na lista.

Entendeu a ideia?

Criado 4 de julho de 2012
Ultima resposta 5 de jul. de 2012
Respostas 10
Participantes 6