Comportamento de um ArrayList

Boa noite galera do GUJ, estou com um pequeno problema de lógica do qual não estou conseguindo resolver no momento, sou iniciante na linguagem. Estudando acerca de ArrayList já me deparei com diversos problemas, passei e aprendi com os erros, mas esse está me deixando um tanto quanto encucado. tenho uma classe Veiculo com seus aatributos, os quais são setados na tela de cadastro, Tenho também uma classe Veiculos que é um ArrayList que recebe Veiculo, uso o método add e tudo erto, na mesma tela de cadastro, ao clicar em cadastrar ele pega os atributos do veículo que está no ArrayList e mostro em um JOptionPane, sem problemas, o problema mesmo occorre quando dou dispose() nessa tela de cadastro e tento buscar os dados do veículo através da placa acessando o ArrayList nisso ele me informa que está vazio, alguémn me ajuda a entender? A lógica que uso para fazer a pesquisa no ArrayList é essa:

public void procurarVeiculo(String placa){
    
    Interface_Principal mainInterface = new Interface_Principal();
    boolean confere = false;
    
    //Testa se o ArrayList está vazio, se sim, mostra aviso que a lista está vazia
    if(listaVeiculos.isEmpty()){
        
        JOptionPane.showMessageDialog(mainInterface, "Nada na lista");
    }
    
    //Itera listaVeiculos até encontrar um objeto veículo veículo com placa igual à passada por parâmtero
    for (int i = 0; i < listaVeiculos.size(); i++) {
      
        if(listaVeiculos.get(i).getPlaca().equals(placa)){
            confere = true;
        }  
    }
        
        if(confere == true){
    
        JOptionPane.showMessageDialog(mainInterface, "Veículo Encontrado!");
    
        }
    
}

Coloque o seu metodo de cadastro tambem

Você está instanciando Interface_Principal, pq?

Bom dia Christian,
tudo bem?

Por favor, você poderia compartilhar outros detalhes da sua implementação? Como:

  • sua classe Veiculo
  • maneira como está criando a lista
  • maneira como está inserindo objetos em listaVeiculos

Com estes dados, acredito que ficará mais fácil ajudá-lo.

Abraço.

1 curtida

Opa beleza? Assim que eu chegar do trabalho posto o restante do código, imagino que realmente seja útil :slight_smile:

thimfont, estou fazendo da seguinte forma:

na classe Interface_Princpal tenho isso:

Metodos_Manipuladores metodo = new Metodos_Manipuladores();
Veiculos classeVeiculos = new Veiculos();
Veiculo veiculo = new Veiculo();

//BOTAO "DAR ENTRADA" PRESSIONADO
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    
    metodo.abreInterfaceCadastro();

} 

// BOTAO "PROCURAR" PRESIONADO
// AQUI É ONDE TENHO PROBLEMA
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    
    String parametroPlaca = jTextField1.getText().toUpperCase();
    classeVeiculos.procurarVeiculo(parametroPlaca);
}                                        

minha classe Veiculo tem:

public class Veiculo {

private String modelo;
private String cor;
private String placa;

public Veiculo() {

}

/**
 * @return the modelo
 */
public String getModelo() {
    return modelo;
}

/**
 * @param modelo the modelo to set
 */
public void setModelo(String modelo) {
    this.modelo = modelo;
}

/**
 * @return the cor
 */
public String getCor() {
    return cor;
}

/**
 * @param cor the cor to set
 */
public void setCor(String cor) {
    this.cor = cor;
}

/**
 * @return the placa
 */
public String getPlaca() {
    return placa;
}

/**
 * @param placa the placa to set
 */
public void setPlaca(String placa) {
    this.placa = placa;
}

}

basicamente getters e setters

minha classe que contém o array list “Veiculos”

public class Veiculos {

Veiculo veiculo = new Veiculo();
ArrayList<Veiculo> listaVeiculos;


public Veiculos(){
    
    listaVeiculos = new ArrayList<>(); 
}



/**
 * mostra os dados vo veiculo que foi cadastrado
 * @param i
 */
public void mostraVeiculo(int i){

Interface_CadastroEntrada cadastroEntrada = new Interface_CadastroEntrada();    
JOptionPane.showMessageDialog(cadastroEntrada, "Veículo cadastrado!\n\nModelo: " +listaVeiculos.get(i).getModelo()
        + " " +listaVeiculos.get(i).getCor() + "\nPlaca: " +listaVeiculos.get(i).getPlaca());       
}
    

/**
 * adiciona um objeto veiculo à lista
 * @param veiculo
 */
public void adicionarVeiculo(Veiculo veiculo) {

    listaVeiculos.add(veiculo);
}

//BASICAMENTE AQUI É ONDE ACHO QUE ESTÁ TODO O PROBLEMA
/**
 * verifica se a placa inserida contem na lista, se sim, 
 * retorna os dados do veiculo
 * 
 * @param placa
 */
public void procurarVeiculo(String placa){
    
    Interface_Principal mainInterface = new Interface_Principal();
    boolean confere = false;
    
    //Testa se o ArrayList está vazio, se sim, mostra aviso que a lista está vazia
    if(listaVeiculos.isEmpty()){
        
        JOptionPane.showMessageDialog(mainInterface, "Nada na lista");
    }
    
    //Itera listaVeiculos até encontrar um objeto veículo veículo com placa igual à passada por parâmtero
    for (int i = 0; i < listaVeiculos.size(); i++) {
      
        if(listaVeiculos.get(i).getPlaca().equals(placa)){
            confere = true;
        }  
    }
        
        if(confere == true){
    
        JOptionPane.showMessageDialog(mainInterface, "Veículo Encontrado!");
    
        }
    
}

}

Minha classe Interfae_CadastroEntrada:

Veiculos listaVeiculos1 = new Veiculos();    
int conta = 0;

//AQUI ELE PERCORRE OS CAMPOS DE TEXTO, PASSA COMO ATRIBUTO PARA Veiculo
//ADICIONA AO ARRAY LIST E PEDE PARA MOSTRAR O QUE FOI INSERIDO
//FEITO ISSO LIMPA OS CAMPOS DE TEXTO

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

   Veiculo veiculo = new Veiculo();
   
   try{ 
   
   veiculo.setModelo(jTextField1.getText().toUpperCase());
   veiculo.setCor(jTextField2.getText().toUpperCase());
   veiculo.setPlaca(jTextField3.getText().toUpperCase());
   
   listaVeiculos1.adicionarVeiculo(veiculo);
   listaVeiculos1.mostraVeiculo(conta);
   
   }catch(Exception e){JOptionPane.showMessageDialog(this, e);}
   
   jTextField1.setText("");
   jTextField2.setText("");
   jTextField3.setText("");
   
   conta++;
} 

Basicamente é isso, pode me ajudar?

Porque você está dando new Array no construtor?

Não precisa toda essa pataquaiada kk dentro do seu metodo procurarVeiculo()

Se quer saber se tem algo dentro do seu ArrayList, simplesmente pergunte se contem.

if(listaVeiculos.contains(placa)){
//ok contem
} else {
//não encontrado
}

Não precisa percorrer com loop for para fazer isso

… Mas antes de tudo cara, verifique como vc ta cadastrando isso ai, como ta usando seu ArrayList

Se eu fosse vc, faria um metodo de listar, usando ArrayList para retornar um ArrayList obviamente, pegaria esse retorno, e colocaria no ArrayList do metodo busca…

Assim vc iria garantir que os dados estariam vindos de uma fonte real

Olá Cristian,
tudo bem?

Obrigado por compartilhar sua lógica. Cara, você já está bem mais avançado do que eu kkkk. Como ainda não “manjo” muito a parte das telas, vou focar na lógica, sobre esta ótica eu reproduzi sua aplicação e funcionou legal. Fiz algumas alterações e gostaria de compartilhá-las com você como sugestões. Bem, eu resumi a aplicação em 3 Classes. Foram elas:

  • Veiculos

  • VeiculosDao

o DAO (Data Access Object) é uma nomenclatura sugerida por um conceito de Design Pattern. De modo geral, nesta classe, devem estar toda a lógica (regra de negócio ) para interação / manipulação do seu objeto do tipo Veiculos. O nome desta classe é formado por: tipo + DAO resultando neste caso em: VeiculosDao.

  • TestaVeiculo

Possui o método main() .

Criando a implementação
Ao criar as classes, tente sempre manter nelas apenas atributos e métodos que devem realmente ser dela. Evite colocar código de outras classes, ou implementar o método de outras classes, assim, o acoplamento entre elas se tornará fraco. Quanto mais genéricas forem suas classes melhor.

Classe Veiculos
Esta é a sua classe Veiculo (sem o “esse”). Repeti exatamente o que você havia feito :grin:
OBS: Como @Jonas_B_a_r_r_o_s havia comentado, você não precisa deste trecho de código:

public Veiculo() {

}

Simplesmente porque ele não esta fazendo nada. Este é o construtor padrão da classe. A classe completa ficou assim:

package veiculos;

public class Veiculos {
private String modelo;
private String cor;
private String placa;

public String getModelo() {
return modelo;
}

public void setModelo(String modelo) {
this.modelo = modelo;
}

public String getCor() {
return cor;
}

public void setCor(String cor) {
this.cor = cor;
}

public String getPlaca() {
return placa;
}

public void setPlaca(String placa) {
this.placa = placa;
}
}

Classe VeiculosDao
Esta é sua classe Veiculos. Fiz algumas alterações nela. Vamos lá:

Bem, como os dados do veículo diretamente no banco, mantive o atributo do tipo Array para depois consultarmos os dados nele.

Estou utilizando o polimorfismo neste caso. O atributo lista é do tipo List. Como a classe ArrayList implementa uma List (interface), posso armazenar meu array neste atributo. Também estou informando que o meu Array será do tipo Veiculos.

private List <Veiculos> lista = new ArrayList<>();

Este método, adiciona, está igual ao seu também.

public void adiciona(Veiculos veiculo) {
		lista.add(veiculo);
	}

Neste método, alterei o retorno dele para devolver um objeto do tipo Veiculos. Também retirei as chamadas da Classe JOptionPane de modo que a restringir a responsabilidade desta classe que é apenas encontrar um veículo a partir da placa. O atributo confere também foi descartado. A maneira como estou percorrendo a lista é conhecida como ForEach. De modo geral, informo o tipo de objeto contido no Array e a lista.

public Veiculos buscaPorPlaca(String placa){
		for(Veiculos v : this.lista){
			if(v.getPlaca().equals(placa))
				return v;
		}
		return null;
}

O método mostraVeiculo, eu suponho, por causa dos parâmetros que recebe (int i) que você está executando ele dentro de um loop como o for. Fiz uma pequena modificação de modo que, ao chamar este método, ele me retorne a lista atual:

public List getLista(){
return this.lista;
}

Assim, a Classe VeiculosDao, não fica responsável por saber como funciona a implementação da interface. Ela apenas faz as interações (adicionar, remover, atualizar e buscar) devolvendo algum objeto, quando necessário.

Como havia comentado, ao invés de criar a interface em telas, implementei apenas um Classe para testes. Ela ficou assim:

package veiculos;

import java.util.List;

public class TestaVeiculo {
	public static void main(String[] args) {
		// Objeto será utilizado para invocar os metodos que manipulam a lista
		VeiculosDao dao = new VeiculosDao();

		// Instanciando objeto e setando valores
		Veiculos v1 = new Veiculos();
		v1.setCor("Vermelhor");
		v1.setModelo("A3");
		v1.setPlaca("ABC-123");
		// adiciona veiculo novo
		dao.adiciona(v1);

		// Instanciando objeto e setando valores
		Veiculos v2 = new Veiculos();
		v2.setCor("Azul");
		v2.setModelo("Gol");
		v2.setPlaca("XPT-456");
		// adiciona veiculo novo
		dao.adiciona(v2);

		// Instanciando objeto e setando valores
		Veiculos v3 = new Veiculos();
		v3.setCor("Amarelo");
		v3.setModelo("Fox");
		v3.setPlaca("WYZ-789");
		// adiciona veiculo novo
		dao.adiciona(v3);

		//recupera a lista 
		List<Veiculos> listaComTodosOsVeiculos = dao.getLista();
		
		//percorre a lista
		//for (Veiculos lv : listaComTodosOsVeiculos)
		//	System.out.println(lv.getModelo());
		
		//procura veiculo pela placa
		Veiculos novo = dao.buscaPorPlaca(v2.getPlaca());
		System.out.println(novo.getModelo());

	}
}

Tente refatorar suas classes para este modelo, teste e se funcionar, evolua para a tela.

Espero ter ajudado / contribuído com algo =D