Hospedagem Profissional

Hospedagem Profissional
Clique aqui e ganhe US$ 10,00 para testar durante 1 mês a melhor hospedagem: Digital Ocean!

quarta-feira, 22 de outubro de 2008

Mapeamento de índices para Objetos com HashMap

No curso de Ciência da Computação aprendemos as diversas aplicações usando coleções de objetos. Um exemplo de coleção, freqüentemente usada, é o ArrayList genérico do Java 1.5.0, mas no dia-a-dia podemos nos deparar com problemas em que, dado um valor devemos ?ligá-lo? diretamente a um determinado objeto, um exemplo disso seria ?ligar? um cpf diretamente a uma pessoa ou ?ligar? uma matrícula a um aluno especifico.


O cpf ou a matricula é o que chamamos de Keys ( valores chaves ), ou seja, valores que mapeiam(ligam) para um determinado Objeto, sendo um aluno ou uma pessoa. Se quiséssemos achar um aluno através de sua matricula em um ArrayList com todos os alunos, deveríamos procurar um por um nessa lista, o que seria ineficiente se a lista de alunos for muito grande. Assim nesse artigo vamos mostrar como resolver esse problema usando a classe HashMap.

Vamos usar como exemplo, um objeto Aluno que possui como atributos:

Um nome
Uma matricula
O coeficiente
O período em que esta matriculado


Agora vamos mapear cada matricula a um determinado aluno e imprimir na tela todos os seus atributos. Esse tipo de mapeamento, também conhecido como mapeamento um-para-um, resolverá nosso problema e precisaremos de 3 classes:

Classe Aluno
Classe UsandoHashMaps
Classe Programa( classe com o método main)


Segue abaixo o código das respectivas classes:

01 //classe Aluno 
02 public class Aluno {
03 
04 private String nome;
05 private int matricula;
06 private double coeficiente;
07 private int periodo;
08 
09 public AlunoString nomeParam, int matriculaParam, int coefParam, int periodoParam) { 
10 setNome(nomeParam);
11 setMatricula(matriculaParam);
12 setCoeficiente(coefParam);
13 setPeriodo(periodoParam);
14 
15 }//fim do construtor
16
17 ...//métodos get e set
18 }//fim da classe aluno






Na classe UsandoHashMaps, descrita abaixo, temos o construtor da classe que cria um objeto do tipo HashMap, temos a criação de dois objetos do tipo Aluno e adicionamos ao HashMap usando o método put( Key, Value), que recebe como primeiro argumento um Inteiro correspondente a matricula do aluno e como segundo argumento um objeto mapeado pela matricula, no caso, um Aluno.Temos um método chamado entradaDoUsuario que solicita a entrada de uma matricula, essa sendo digitada pelo usuário, e logo após imprimir na tela os dados do aluno correspondente a matricula digitada, caso não houver um aluno cuja matricula foi digitada, o programa verifica essa condição com a passagem

1 if!mapeamentoDeAlunos.containsKey(valorDigitadoInteiro) ) throw new Exception();


Significa ?Se não existir matricula valorDigitadoInteiro dentro do mapeamento então lançar exceção?.

A classe UsandoHashMaps esta descrita abaixo:

01 public class UsandoHashMaps {
02 
03 private HashMap mapeamentoDeAlunos;
04 
05 public UsandoHashMaps(){
06 mapeamentoDeAlunos = new HashMap();
07
08 Aluno marcelo = new Aluno("Marcelo Oikawa"50297756);
09 Aluno tiozao = new Aluno("Fabricio Passos"50292906);
10 
11 mapeamentoDeAlunos.put(marcelo.getMatricula(), marcelo);
12 mapeamentoDeAlunos.put(tiozao.getMatricula(), tiozao);
13 
14 entradaDoUsuario();
15 }//fim do construtor 
16
17 public void entradaDoUsuario() {
18 int valorDigitadoInteiro = 0;
19 String valorDigitado = JOptionPane.showInputDialog(null, "Digite numero da matricula""Entrada de dados", JOptionPane.DEFAULT_OPTION);
20
21 try {
22 valorDigitadoInteiro = Integer.parseInt(valorDigitado);
23 if!mapeamentoDeAlunos.containsKey(valorDigitadoInteiro) )
24 throw new Exception();
25 
26 System.out.println"Nome : " + mapeamentoDeAlunos.get(valorDigitadoInteiro).getNome() );
27 System.out.println"Coeficiente : " + mapeamentoDeAlunos.get(valorDigitadoInteiro).getCoeficiente() );
28 System.out.println"Periodo : " + mapeamentoDeAlunos.get(valorDigitadoInteiro).getPeriodo() );
29 
30 }
31 catchException e){
32 JOptionPane.showMessageDialog(null, "Não existe aluno com essa matricula""Erro", JOptionPane.ERROR_MESSAGE)
33 }
34 
35 }//fim do metodo entradaDoUsuario
36 }//fim da classe UsandoHashMaps


Classe Programa:

1 public class Programa {
2 public static void main(String args[]){
3 
4 UsandoHashMaps teste = new UsandoHashMaps();
5 
6 }//fim do metodo main
7 }//fim do Programa


Enfim, ao executar o programa e digitar uma matricula existente no mapeamento, o programa deve gerar a seguinte saída:

Nome : Fabrício Passos
Coeficiente : 90.0
Período : 6


O que indica o sucesso desse mapeamento.

Considerações Finais

A classe HashMap é equivalente à classe HashTable, exceto pelo fato de que HashMap não é sincronizada, ou seja, múltiplos threads podem alterar o mapeamento concorrentemente.
HashMap também admite valores nulos.

Conclusão

Assim finalizamos esse artigo mostrando como foi realizado um mapeamento simples em Java, mapeamento este mais eficiente do que uma busca seqüencial caso fosse utilizado um ArrayList para o determinado problema apresentado.
Estude um problema qualquer que envolva Coleções, agora você possui o conhecimento de mais uma ferramenta que pode te ajudar.

Até a próxima e boa sorte.

Marcelo Oikawa

Fonte : http://www.guj.com.br/java.tutorial.artigo.186.1.guj