Sei sulla pagina 1di 6

usando as bibliotecas padr�o de java - parte 2 - vis�o geral - iousando as

bibliotecas padr�o de java - parte 2 - vis�o geral - util


exerc�cios de laborat�rio de conceitos e t�cnicas de programa��o
aula 10
prof. jorge fernandes (jorge@dimap.ufrn.br)
objetivo
esta aula tem por objetivo exercitar o uso de algumas classes das bibliotecas
padr�o de java, chamadas apis (application programming interfaces). muitos
exemplos s�o baseados no tutorial de java produzido pela sun microsystems.
aten��o especial ser� dada � aplica��o da biblioteca java.util, que cont�m
v�rias implementa��es de estruturas de dados.
a pr�tica consiste no:
vis�o geral da api java.util
estudo de como usar as classes vector, hashmap e arrays
vis�o geral do pacote (ou api) java.util
o pacote java.util cont�m v�rias classes chamadas de utilit�rias. cada classe
deste pacote cont�m um conjunto de m�todos que podem ser �teis em diversas
situa��es.
visite a p�gina com a documenta��o html gerada para a api java. visite a p�gina
do package java.util e responda:
quantas classes s�o declaradas no package?
quantos m�todos construtores, m�todos est�ticos e m�todos n�o est�ticos
(tamb�m chamados de m�todos de inst�ncia) s�o declarados em cada uma das
classes vector, hashmap e arrays? preencha a tabela abaixo. classeqtd
m�todos construtoresqtd m�todos est�ticosqtd m�todos de inst�ncia
vector
hashmap

arrays

abaixo s�o apresentadas algumas das classes mais importantes, com indica��o de
uso das mesmas:

vector
suponha que voc� necessita utilizar um array para armazenar uma s�rie de
objetos, mas n�o sabe a priori qual o tamanho do array. em outras palavras, voc�
precisa de um array de tamanho vari�vel. neste caso objetos da classe vector s�o
indicados para substituir o array.
por exemplo, o c�digo abaixo cria um array de 3 posi��es, e, enquanto o usu�rio
n�o digitar um string vazio, insere o string em posicoes subsequentes do array.
em seguida o programa imprime todos os elementos digitados.
class testearray {
public static void main(string[] args) {
string[] nomes = new string[3];
int i = 0;
// armazena varios nomes
while (true) {
system.out.println("digite um nome para armazenar em nomes["+i+"]");
string nome = io.readstr();
if (nome.length() == 0) {
break;
}
nomes[i] = nome;
i++;
}
// imprime os nomes digitados
for (int j = 0; j < nomes.length; j++) {
system.out.println(nomes[j]);
}
}
}
o programa acima s� funciona se forem digitados at� 3 strings. uma forma de
contornar esta limita��o � definir, antes de criar o array, qual o tamanho
m�ximo deste. outra forma � atrav�s do uso de um objeto vector, como mostrado
abaixo:
import java.util.vector;

class testevector {
public static void main(string[] args) {
vector nomes = new vector();
int i = 0;
// armazena varios nomes
while (true) {
system.out.println("digite um nome para armazenar em nomes["+i+"]");
string nome = io.readstr();
if (nome.length() == 0) {
break;
}
nomes.insertelementat(nome, i);
i++;
}
// imprime os nomes digitados
for (int j = 0; j < nomes.size(); j++) {
system.out.println(nomes.elementat(j));
}
}
}
perceba a declara��o de importa��o da classe vector no in�cio do arquivo.
perceba ainda que na cria��o do vector n�o h� indica��o de seu tamanho inicial
ou m�ximo. o vector � uma estrutura auto ajust�vel, que cresce � medida em que
mais elementos forem adicionados a ele. perceba as diferen�as entre os c�digos
testearray e testevector. compile-os, execute-os e perceba que o uso do vector
permite a digita��o de uma quantidade arbitr�ria de valores.
abaixo mostramos uma outra forma de usar a classe vector, que torna
desnecess�rio o uso de um contador para a quantidade de objetos armazenados no
vector, pois o vector cuida internamente desta informa��o.
import java.util.vector;
class testevector2 {
public static void main(string[] args) {
vector nomes = new vector();
// armazena varios nomes
while (true) {
system.out.println("digite um nome para armazenar");
string nome = io.readstr();
if (nome.length() == 0) {
break;
}
nomes.add(nome);
}
// imprime os nomes digitados
for (int j = 0; j < nomes.size(); j++) {
system.out.println(nomes.elementat(j));
}
}
}
agora responda as perguntas abaixo:
como se cria um objeto vector?
quais foram os m�todos da classe vector utilizados no programa acima?
como saber quantos elementos est�o armazenados em um vector?
quais foram os dois m�todos usados para armazenar informa��es em um vector?
hashmap
suponha que voc� armazenou um conjunto de objetos, onde cada objeto possui uma
chave �nica de acesso. por exemplo, um conjunto de dados de pessoas com seus
nomes. suponha agora que voc� tem o nome de uma pessoa e necessita mostrar todas
as informa��es armazenadas sobre esta pessoa. o programa abaixo mostra como isto
pode ser feito utilizando-se um array.
import java.util.vector;
class pessoa {
string nome;
string endereco;
string datanascimento;
}
class testevectorpessoas {
public static void main(string[] args) {
vector pessoas = new vector();
// armazena varias informa��es sobre uma pessoa
while (true) {
system.out.println("digite o nome da pessoa a armazenar");
string nome = io.readstr();
if (nome.length() == 0) {
break;
}
system.out.println("digite o endereco da pessoa");
string endereco = io.readstr();
system.out.println("digite a data de nascimento da pessoa");
string datanascimento = io.readstr();
pessoa p = new pessoa();
p.nome = nome;
p.endereco = endereco;
p.datanascimento = datanascimento;
pessoas.add(p);
}
// busca informa��es sobre pessoas atrav�s do nome
while (true) {
system.out.println("digite o nome da pessoa a buscar");
string chave = io.readstr();
if (chave.length() == 0) {
break;
}
// buscar as informa��es sobre a pessoa
boolean encontrado = false;
for (int j = 0; j < pessoas.size(); j++) {
pessoa p = (pessoa) pessoas.elementat(j);
if (p.nome.equals(chave)) {
system.out.println("nome:"+p.nome);
system.out.println("endereco:"+p.endereco);
system.out.println("nascimento:"+p.datanascimento);
encontrado = true;
break;
}
}
if (! encontrado) {
system.out.println("nome nao encontrado");
}
}
}
}
perceba que no c�digo acima a busca da pessoa com o nome informado � feita de
forma linear, isto �, desde o in�cio do array at� encontrar uma pessoa com o
nome indicado, ou chegar ao final do array.
se o array contiver um milh�o de nomes, no pior caso, a busca ser� feita em um
milh�o de posi��es, o que podem ser muito demorado. uma solu��o mais eficiente �
utilizar uma estrutura de dados que ofere�a acesso otimizado � busca nos dados.
uma destas estruturas � chamada de tabela de dispers�o (hash table), a qual �
implementada atrav�s da classe hashmap. quando um objeto hashmap � criado duas
opera��es b�sicas podem ser executadas sobre ele: (1) put - armazenamento de
informa��es usando uma chave; e (2) get - busca da informa��o armazenada
conforme uma chave informada.
o c�digo abaixo ilustra como usar uma hashmap para implementar uma solu��o
parecida com a anterior, mas eliminando a buscar linear sobre o array.
import java.util.hashmap;
class pessoa {
string nome;
string endereco;
string datanascimento;
}
class testevectorpessoas {
public static void main(string[] args) {
hashmap pessoas = new hashmap();
// armazena varias informa��es sobre uma pessoa
while (true) {
system.out.println("digite o nome da pessoa a armazenar");
string nome = io.readstr();
if (nome.length() == 0) {
break;
}
system.out.println("digite o endereco da pessoa");
string endereco = io.readstr();
system.out.println("digite a data de nascimento da pessoa");
string datanascimento = io.readstr();
pessoa p = new pessoa();
p.nome = nome;
p.endereco = endereco;
p.datanascimento = datanascimento;
pessoas.put(nome, p);
}
// busca informa��es sobre pessoas atrav�s do nome
while (true) {
system.out.println("digite o nome da pessoa a buscar");
string chave = io.readstr();
if (chave.length() == 0) {
break;
}
// buscar as informa��es sobre a pessoa
pessoa p = (pessoa) pessoas.get(chave);
if (p != null) {
system.out.println("nome:"+p.nome);
system.out.println("endereco:"+p.endereco);
system.out.println("nascimento:"+p.datanascimento);
} else {
system.out.println("nome nao encontrado");
}
}
}
}
compile e analise as diferen�as entre os c�digos acima e responda �s seguintes
quest�es:
quais os m�todos da classe hashmap que foram utilizados?
supondo que o objeto pessoa seja equivalente a um registro em um arquivo com
v�rios campos, no exemplo de c�digo acima, qual objeto atua como a chave? qual
objeto atua como o registro? quais s�o os campos do registro?
arrays
arrays � uma classe utilit�ria, que cont�m uma s�rie de m�todos est�ticos para
manipular informa��es armazenadas em um array. usando arrays voc� pode aplicar
opera��es de busca bin�ria, teste de igualdade entre elementos de um array,
preenchimento de informa��es de um array e ordena��o dos elementos do array
conforme um crit�rio especificado.
suponha que tenhamos uma lista de nomes em um array de strings e queremos
apresentar a lista dos nomes de forma lexicograficamente ordenada. o c�digo
abaixo realiza esta tarefa usando o m�todo sort da classe arrays.
import java.util.arrays;

class testearrayordenado {
public static void main(string[] args) {
string[] nomes = new string[20];
int i = 0;
// armazena varios nomes
while (true) {
system.out.println("digite um nome para armazenar em nomes["+i+"]");
string nome = io.readstr();
if (nome.length() == 0) {
break;
}
nomes[i] = nome;
i++;
}
// imprime os nomes digitados em ordem alfab�tica
arrays.sort(nomes);
for (int j = 0; j < nomes.length; j++) {
system.out.println(nomes[j]);
}
}
}
caso os elementos que desejemos ordenar estejam em um vector, ent�o � preciso
gerar um array correpondente com as informa��es do vector. use o m�todo
toarray(), como descrito abaixo, para transformar o programa testevector2 em um
programa testevectorordenado, que recebe uma quantidade arbitr�ria de strings e
imprime os nomes digitados em ordem alfab�tica.
import java.util.*;

class exemplodeusodetoarray {
public static void main(string[] args) {
vector nomesvector = new vector();
nomesvector.add("ola");
nomesvector.add("como vai");
nomesvector.add("aspirante a programador");
string[] nomesarray = (string[]) nomesvector.toarray();
arrays.sort(nomesarray);
for (int i = 0; i < nomesarray.length; i++) {
system.out.println(nomesarray[i]);
}
}
}
exerc�cio para casa
construa um programa java que l� um arquivo no formato abaixo, com um n�mero
qualquer de registros, e cria em mem�ria um conjunto de objetos com as
informa��es do arquivo, imprimindo os registros do arquivo de forma ordenada.
joao natal 29/01/2002
jose recife 15/10/1964
maria natal 09/01/2001
pedro joaopessoa 02/03/1976

dica: voc� deve usar as classes vector, arrays, e hashmap na sua implementa��o.
use ainda os filtros para leitura de arquivos mostrados na p�gina leitura de
arquivos usando filtros.
leitura adicional: stringtokenizer
estude qual a utilidade dos objetos da classe stringtokenizer. junto com vector
e hashmap, � uma das classes mais importantes do package java.util.

jorge henrique cabral fernandes, dsc


professor adjunto i - dimap - ufrn

Potrebbero piacerti anche