Buscando dentro de um Array list dentro de um objeto

Gente, poderiam me ajudar, eu tenho que completar esse codigo, no qual ele tem de verificar e salvar os doces de um rerspectivo usuario. O objetivo é fazer um usuario poder ter varios doces, e o codigo pode ter varios usuarios cadastrados, cada usuario contendo sua propria lista de doces cadastrados. O problema é que o método de listagem saiu como uma listagem geral, de todos os doces que cadastrei, e não uma listagem especifica. Extendi o array de doces para usuario, mas agora, quando saio da parte do paiel dos doces dentro do 2° do-while e volto, tudo some. Alguém tem uma ideia de como fazer isso, uma arraylist dentro de um objeto e dentro de outra arraylist.

O meu ficou assim: doce --> Cesta(array de doces) --> extends–> Usuario–>Clientes(array de usuario)

do {//1° repeticao

	System.out.println("USUARIOS: \n1 - cadastrar 2 - listar 3 - entrar 0 - sair ");
		m = x.nextInt();
		Usuario u = new Usuario();
	switch(m) {//1 switch

	case 1: 
			
		System.out.println("informe seu nome:");
		u.setNomeCivel(x.next());
		cl.Adicionar(u);
		s.Salvar(u);
			
	break;
			
	case 2: 
		cl.listar();
		
	break;
				
	case 3:   
		System.out.println("informe nome");
		String n = x.next();
			
		cl.Verificar(n);
			
		if( cl.Verificar(n) == true){//***--> tela de comparação-->>
				
			int a1 ;
			do{//02 repeticao ***--->> TRACK AQUI-->>
					
				System.out.println(" PIANEL DE DOCES:: \n 4 -cadastra 5 - listar 0 - sair");
					
				a1 = x.nextInt();
				
			switch(a1){//02 switch
													
			case 4: Doce d = new Doce();
				System.out.println("informe nome e qtde de doces:");
				d.setNome(x.next());
				d.setQtde(x.nextInt());
						
				u.Adicionar(d);
			
			break;
									
			case 5: try {
				u.listar();
						  
				}catch(NullPointerException e) {
					System.out.println("não contem ninguem cadastrado");
				}
						
				//cs.listar();
						
			break;
					
			case 0:   System.out.println("ate mais!");
			 			try {
			cl.newCandy(n, u);
			System.out.println("tudo certo aqui!");
			 			}catch(Exception e) {
			System.out.println("nao pude dar por cadastrado");
					}
			
	
			break;
		
				default: System.out.println("usuario invalido");
							}//fim do 02 switch

Olá, @Laio,

quero te ajudar, mas para isso seria melhor você postar aqui o código ou pelo menos a parte dele que contenha o problema.
Assim fica mais fácil entender seu problema.

Você fez Doce estender Usuario? Isso não faz sentido.

class PrimeiraClasse {
    
    List<SegundaClasse> objetosDaSegundaClasse;
}

class SegundaClasse {
    
    List<OutraClasse> objetosDaOutraClasse;
}

USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
3
informe nome
alguem
bem vindo sr(a) alguem
bem vindo sr(a) alguem
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
4
informe nome e qtde de doces:
doce1
50
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
4
informe nome e qtde de doces:
doce
40
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
5
Doce [nome=doce1, rodada=null, qtde=50]
Doce [nome=doce, rodada=null, qtde=40]
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
0
ate mais!
tudo certo aqui!
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
3
informe nome
alguem
bem vindo sr(a) alguem
bem vindo sr(a) alguem
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
5
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
0
ate mais!
tudo certo aqui!
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
0
volte sempre!

essa foi a compilação

Você pode criar um atributo na sua classe Usuario chamado listaDeDoces do tipo ArrayList<Doce> (se não conhece a classe ArrayList, veja esse tutorial incrível).

Assim, cada usuário terá uma lista de doces própria. Na classe usuário você atualiza seu método Adicionar(Doce d) para isso:

public void  Adicionar (Doce d) {
    this.listaDeDoces.add(d);
}

Seu método listar() precisa mostrar todos os doces, então use:

public void listar() {
   for (int i = 0; i < this.listaDeDoces.size(); i++) {
        System.out.println(listaDeDoces.get(i));
   }
}

Não precisa fazer tratamento de exceção nesse caso, já que se não houver nenhum doce ele simplesmente não mostra nada, não dá NullPointerException. Mas você pode fazer uma verificação do tamanho do ArrayList para mostrar a mensagem "Nenhum doce cadastrado" caso o tamanho seja 0.

Pra lista de doces fica melhor se eu exende-la a classe Usuario ou transforma-lá em objeto, já que um usuário tem apenas um nome, mas pode ter varios doces?

Asssim:

public class Usuario exends listadedoces{

}

ou

public class Usuario exends listadedoces{

Objeto.listadedoces listadedosces
}

Um usuário é uma lista de doces?

Bem, eu pego nome e qtde de doces e crio uma arraylist com eles, ex, Cesta = new ArrayList

Ai, ou eu pego essa lista de doces e extendo pra classe usuario (so contém o atributo nome de usuário no caso), ou coloco Cesta como objeto de usuário, ai crio Clientes <Usuario. = new ArrayLIst;, ou seja, como vc falou, uma matriz, aonde se tem varios pelo meno um usuario, porem cada usuario tem sua própia lista de doces cadastrados;

então sim, tbm seria uma lista de doces, ou pelo menos na logica que criei sim, porém, se está exatamente coerente não tenho certeza, pois na hora de listar não sai como planejei, saí tudo o que cadastrei, mesmo com usuarios novos

Não faz o menor sentido um usuário estender uma lista de doces.
Um usuário não é uma lista de doces, ele contém uma lista de doces.

public class Usuario {

    private String nome;
    private List<Doce> doces = new ArrayList<>();
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public String getNome() {
        return nome;
    }
    
    public void adicionarDoce(Doce doce) {
        doces.add(doce);
    }
    
    public void removerDoce(Doce doce) {
        doces.remove(doce);
    }
    
    public int quantidadeDoces() {
        return doces.size();
    }
}

blz, logo, pra minha matriz de clientes, ficaria assim:

public class Clientes {

ArrayListclientes;

public Clientes() {
clientes = new ArrayList();
}

public boolean Adicionar(Usuario u) {

return clientes.add(u);

}

public void listar() {

for(int i=0;i<clientes.size();i++) {
	System.out.println(clientes.get(i).toString());

//Acho que esse metodo de listagem não está adequado, pois da TUDO, mas é pra ser especiífico
}
}

Será aqui também que eu crio o método de adicionarDoces

Oi pessoas, por gentileza, eu criei esse codigo aqui mas ele da erro, sempre fica repetindo os mesmos objetos dentro da matriz:
public Usuario newCandy(String n, Usuario u2) {

int x=0;
Usuario salvo = new Usuario();
		//for(Usuario u2:clientes) {
	for(int i=0;i<clientes.size();i++) {
if(n.equals(clientes.get(i).getNomeCivel())) {
			
	salvo = u2;
	System.out.println("a posicao eh " + i);
	x = i;
	
	break;
	}
}
	
	return clientes.set(x, salvo);

}

public void listarDoces(String n) {
for(int i=0;i<clientes.size();i++) {
if(n.equals(clientes.get(i).getNomeCivel())) {

		clientes.get(i).listar();
		break;

}
}
}

Porque aquele codigo la em cima dá isso:
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
2
Usuario [nomeCivel=Alguem]
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
1
informe seu nome:
OutroAlguem
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
2
Usuario [nomeCivel=Alguem]
Usuario [nomeCivel=OutroAlguem]
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
3
informe nome
alguem
email nao cadastrado
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
3
informe nome
Alguem
bem vindo sr(a) Alguem
bem vindo sr(a) Alguem
PAINEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
4
informe nome e qtde de doces:
a
50
PAINEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
4
informe nome e qtde de doces:
b
23
PIANEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
5
PAINEL DE DOCES::
4 -cadastra 5 - listar 0 - sair
0
a posicao eh 0
ate mais!

USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair
2
Usuario [nomeCivel=OutroAlguem]
Usuario [nomeCivel=OutroAlguem]
USUARIOS:
1 - cadastrar 2 - listar 3 - entrar 0 - sair

//—>>No final repete exatamente os mesmos ultimos que cadastrei, se não fosse por isso estaria do jeito que queria,

Oi pessoas, consegui fazer o meu progama funcionar do jeito que descrevi lá emcima, um arraylist matriz, apesar de dar um pouco de trabalho, e muito obrigado a vcs que deram dicas pra mim, pela ajuda . São esses os metodos que usei pra gerenciar o progama:

//=====>>>>> =====>>>>> MÉTODOS DA MATRIZ DE CLIENTES: -==->>> -==->>> -==->>>

//01) ESSE VERIFICA SE O USUARIOI PEDIDO EXISTE OU NÃO
public boolean Verificar(String n) {

for(Usuario u:clientes) {
	if(   n.equals(u.getNomeCivel())) {
		System.out.println(" \n \n bem vindo sr(a) " + u.getNomeCivel() );
		return true;
		
	}else {
		System.out.println("usuario inexistente");
	}
}
return false;

}

//02)ESSE DÁ COMO RETORNO U MESMO OBJETO tipo USUARIO, IGUAL COMO FOI SALVO NA list CLIENTES
public Usuario Associar(String n) {

Usuario escolhido = null;
      for(Usuario u:clientes) {
			
    	  if(   n.equals(u.getNomeCivel())) {
		escolhido = u;
			break;
	}	

}
return escolhido;
}

//03)ESSE PEGA O objeto USUARIO E “set-a” OU O COLOCA DENTRO DO list CLIENTES
public Usuario newCandy(String n) {
int x=0;
Usuario salvo = new Usuario();

		for(Usuario u2:clientes) {
if(  u2.getNomeCivel().equals(n)  ) {
	
	x = clientes.indexOf(u2);
	salvo = u2;
	
	System.out.println("a posicao eh " + x);
	break;
}
}
	return clientes.set(x, salvo);

}

//04) ESSE RETORNA A LISTA DE USUARIO NA POSIÇÃO IDENTICA AO DO NOME PEDIDO, CASO EXISTA
public void listarDoces(String n) {

for(int i=0;i<clientes.size();i++) {
	
	if(n.equals(clientes.get(i).getNomeCivel())) {
		clientes.get(i).listar();
		break;		
	}
}

}

//05)ESTE AQUI DELETA O RESPECTIVO DOCE PEDIDO, DO OBJETO EM QUESTÃO
public void deletarDoce(String nd, String n) {

for(int i=0;i<clientes.size();i++) {//<<== similar ao método de listagem
	if(n.equals(clientes.get(i).getNomeCivel())) {
		System.out.println("doce apagado");
		clientes.get(i).deletar(nd);
	}
}

}

1 curtida