[RESOLVIDO]Dúvida com Collections![+Mapeamento]

5 respostas
Ruttmann

Boa tarde pessoal!

Estou resolvendo um exercicio proposto pelo meu professor para utilizarmos ArrayLists e Maps, e já fiz uns 50% do mesmo, mas só da parte referente a ArrayLists, consegui aprender rápido esse conceito.

Porém estou com dificuldade para trabalhar com Maps. Vou colocar abaixo o enunciado do exercicio(deixei em negrito o que já fiz):

Desenvolva uma classe Produto que represente a informação básica de um produto existente no armazém de uma dada empresa. Sobre cada produto pretende ter a seguinte informação:

private String codigo; // código
private String nome; // descrição
private int quant; // quantidade em estoque
private int alarme; // mínimo de alerta ? valor mínimo aceitável

Crie em seguida uma classe Empresa contendo o nome da empresa em questão e uma representação do estoque da empresa, associando a cada produto a sua lista de informação. Para além dos construtores e métodos usuais, a classe Empresa deverá definir ainda os seguintes métodos de instância:

Método que devolve todos os códigos dos produtos em estoque;
Método que insere um novo produto no estoque da empresa;

Método que remove do estoque o produto de código informado;
Método que altera a quantidade de um produto em estoque de um produto informado;
Método que devolve a quantidade total de produtos em estoque;
Método que verifica se o produto do código informado existe;
Método que cria uma lista com os códigos dos produtos com quantidade <= alarme;
Método que devolve uma cópia do estoque;
Método que devolve a informação de um produto de código informado;

Até aí tudo bem, implementei essas funcionalidades usando ArrayLists. Mas para fazer as outras funcionalidades que envolvem pesquisa, o mais correto seria utilizar um mapa, correto? Pretendo utilizar como parâmetro de pesquisa o código do produto, portanto acredito que o melhor seria colocar como Key dos produtos no mapeamento, o próprio código do produto. Mas como fazer isso? Vou ter quer mudar meu método de cadastro de itens para adicionar o código do produto, no momento do cadastro do mesmo, como sendo a sua Key?

Segue abaixo o que já elaborei:

Classe Produto:

public class Produto {

	private String codigo;
	private String nome;
	private int quant;
	private int alarme;
	
	public Produto() {
		
	}//fim do construtor.
	
	//metodos get e set.	

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getQuant() {
		return quant;
	}

	public void setQuant(int quant) {
		this.quant = quant;
	}

	public int getAlarme() {
		return alarme;
	}

	public void setAlarme(int alarme) {
		this.alarme = alarme;
	}
	
	@Override
	public String toString() {
		return "Nome: "+getNome()+"\nCódigo: "+getCodigo()+"\nQuantidade: "+getQuant()+"\nEstoque mínimo: "+getAlarme()+"\n";
	}
}

Classe Empresa:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.swing.JOptionPane;

public class Empresa {

	List<Produto> produtos = new ArrayList<Produto>();
	Map<String, List<Produto>> mapeamentoEstoque = new HashMap<String, List<Produto>>();

	public void inserirNovoProduto() {
		Produto novoProd = new Produto();
		novoProd.setCodigo(JOptionPane.showInputDialog("Código:"));
		novoProd.setNome(JOptionPane.showInputDialog("Nome:"));
		novoProd.setQuant(Integer.parseInt(JOptionPane
				.showInputDialog("Quantidade:")));
		novoProd.setAlarme(Integer.parseInt(JOptionPane
				.showInputDialog("Estoque mínimo:")));

		produtos.add(novoProd);

	}

	public void devolverTodosOsCodigos() {

		Iterator<Produto> iterator = produtos.iterator();
		// SE O ARRAYLIST TIVER UM PROXIMO ITEM, ENTRA NO WHILE(hasNext);
		while (iterator.hasNext()) {
			// RETORNA O PROXIMO ITEM DA LISTA;
			Produto obj = iterator.next();
			// IMPRIME O ITEM DA LISTA E VOLTA AO INICIO DO LOOP WHILE;
			System.out.println(obj.getCodigo());
		}
	}

	public void removerProdutoDoEstoque() {

	}

	public void devolverCopiaDoEstoque() {
		for (Object object : produtos) {
			Produto obj = (Produto) object;
			System.out.println(obj.toString());
		}
	}

	public void devolverQuantidadeTotalDeEstoque() {
		int quantTotal = 0;
		for (Object object : produtos) {
			Produto obj = (Produto) object;
			quantTotal += obj.getQuant();
		}
		System.out.println("Há " + quantTotal + " produtos em estoque.");
	}
	
	
}

Classe Main(estou utilizando-a para efetuar os testes, a cada nova funcionalidade do sistema implementada, faço um teste geral):

public class Main {
	
	public static void main(String[] args) {
		Empresa novo = new Empresa();
		
		novo.inserirNovoProduto();
		novo.inserirNovoProduto();
		
		novo.devolverQuantidadeTotalDeEstoque();
	}
}

Não tenho idéia de como trabalhar com mapeamento, já aprendi esse conceito mas foi no final da aula, acabei não praticando e esqueci tudo...

Obrigado!

:)

5 Respostas

gabrielfrios

Achei que fosse problemas com JPA, Hibernate, etc… kkkkkk

Bom, aqui tem um pdf sobre Map. Da uma lida ai manolo
http://www.dcc.ufrj.br/~comp2/TextosJava/Maps.pdf

Ruttmann

Achei que fosse problemas com JPA, Hibernate, etc… kkkkkk

Bom, aqui tem um pdf sobre Map. Da uma lida ai manolo
http://www.dcc.ufrj.br/~comp2/TextosJava/Maps.pdf

Que nada colega, heheheh, to aprendendo ainda! :stuck_out_tongue:

Mas então, já li isso ali e não consegui entender nada ainda. Preciso saber inicialmente como eu devo alterar meu método pra cadastrar novos itens, fazendo com que ele cadastre os itens no Map também, e como eu faço pra setar como Key do produto, o código que o operador do sistema informar…

gabrielfrios

Manolo, não é possível que você não entendeu nada. Mas vamos lá

Você quer inserir um chave/valor no Map?

map.put(chave, valor);
Ruttmann

Bom dia!

Li pra caramba ontem a noite e fiquei com um monte de duvidas.

Mas agora, conversei melhor com o professor e consegui sanar todas as dúvidas, terminei o sistema e ficou 100%.

:D

Obrigado a quem postou, vou colocar abaixo meu código, caso sirva de ajuda pra alguém:

Classe Empresa:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.List;

import javax.swing.JOptionPane;

public class Empresa {

	private Map<String, Produto> mapeamentoEstoque = new HashMap<String, Produto>();

	public void inserirNovoProduto() {
		Produto novoProd = new Produto();
		novoProd.setCodigo(JOptionPane.showInputDialog("Código:"));
		novoProd.setNome(JOptionPane.showInputDialog("Nome:"));
		novoProd.setQuant(Integer.parseInt(JOptionPane
				.showInputDialog("Quantidade:")));
		novoProd.setAlarme(Integer.parseInt(JOptionPane
				.showInputDialog("Estoque mínimo:")));
		mapeamentoEstoque.put(novoProd.getCodigo(), novoProd);

	}

	public void devolverTodosOsCodigos() {

		Iterator<Produto> iterator = mapeamentoEstoque.values().iterator();
		while (iterator.hasNext()) {
			Produto obj = iterator.next();
			System.out.println(obj.getCodigo());
		}
	}

	public void removerProdutoDoEstoque(String codigoParam) {
		// NO CASO DE MAPS, NÃO É PRECISO ROTINA(LOOPS) PARA VARRER O MAPA,
		// APENAS DECLARAR COMO ABAIXO.
		if (mapeamentoEstoque.containsKey(codigoParam)) {
			mapeamentoEstoque.remove(codigoParam);
		}
	}

	public void devolverCopiaDoEstoque() {
		for (Produto produto : mapeamentoEstoque.values()) {
			System.out.println(produto.toString() + "\n");
		}
	}

	public void devolverInformacaoDeUmProduto(String codigoParam) {
		if (mapeamentoEstoque.containsKey(codigoParam)) {
			String infoProduto = mapeamentoEstoque.get(codigoParam).toString();
			JOptionPane.showMessageDialog(null, infoProduto);
		}
	}

	public void devolverQuantidadeTotalDeEstoque() {
		int quantTotal = 0;
		for (Produto produto : mapeamentoEstoque.values()) {
			quantTotal += produto.getQuant();
		}
		System.out.println("Há " + quantTotal + " produtos em estoque.");
	}

	public void alterarQuantidadeEmEstoque(String codigoParam) {
		if (mapeamentoEstoque.containsKey(codigoParam)) {
			mapeamentoEstoque
					.get(codigoParam)
					.setQuant(
							Integer.valueOf(JOptionPane
									.showInputDialog("Informe a nova quantidade em estoque")));
		}
	}

	public void verificarSeCodigoExiste(String codigoParam) {
		if (mapeamentoEstoque.containsKey(codigoParam)) {
			JOptionPane.showMessageDialog(null, "Código informado já existe");
		} else
			JOptionPane.showMessageDialog(null,
					"Código informado não existe no estoque.");
	}

	public void reportarProdutosComEstoqueBaixo() {
		List<Produto> listaDeProdutosAlarme = new ArrayList<Produto>();
		for (Produto produto : mapeamentoEstoque.values()) {
			if (produto.getQuant() <= produto.getAlarme()) {
				listaDeProdutosAlarme.add(produto);
			}
		}
		JOptionPane.showMessageDialog(null,
				"Lista gerada, pressione Enter para exibir");
		for (Produto produto : listaDeProdutosAlarme) {
			System.out.println(produto.toString() + "\n");
		}
	}
}
Classe Produto:
public class Produto {

	private String codigo;
	private String nome;
	private int quant;
	private int alarme;
	
	public Produto() {
		
	}//fim do construtor.
	
	//metodos get e set.	

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getQuant() {
		return quant;
	}

	public void setQuant(int quant) {
		this.quant = quant;
	}

	public int getAlarme() {
		return alarme;
	}

	public void setAlarme(int alarme) {
		this.alarme = alarme;
	}
	
	@Override
	public String toString() {
		return "Nome: "+nome+"\nCódigo: "+codigo+"\nQuantidade: "+quant+"\nEstoque mínimo: "+alarme;
	}
}

O main acho que não precisa né! :lol:

gabrielfrios

Boa manolo, é isso ai. Parabéns pelo esforço. Já coloca como resolvido no tópico.

Criado 17 de maio de 2012
Ultima resposta 18 de mai. de 2012
Respostas 5
Participantes 2