Transcript

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

CapCapíítulo 21tulo 21ColeColeççõesões

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Objetivos do Capítulo

� Analisar o conceito de coleção e sua relação com as

estruturas de dados.

� Apresentar a arquitetura do framework de coleções do Java.

� Indicar as classes e interfaces do framework de coleções do

Java que podem ser empregadas para a representação de

cinco diferentes tipos de coleções: listas, pilhas, filas,

conjuntos e mapas.

� Explorar os algoritmos disponíveis no framework de coleções

do Java que permitem a realização de diferentes operações

sobre coleções e sobre vetores.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Conceito de coleção

� Objeto

� Agrupa múltiplos elementos

� Organiza-os sob determinada forma

� Realiza diferentes operações sobre eles

� Coleção & Estrutura de Dados

� E.D.: define uma forma de organização dos dados

� Coleção:

� Estrutura de dados pré-empacotada

� Parte integrante da API de determinado ambiente de programação

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Coleções no JSE 1.0

� Poucas coleções

� java.util.Vector: vetor de objetos redimensionável

� java.util.Stack: pilha de objetos

� java.util.Hashtable: implementação de uma tabela de hash

� Criação de bibliotecas de terceiros

� Coleções no JSE 1.2

� Introdução de um framework de coleções

� JCF: Java Collections Framework

� Arquitetura bem planejada

� Acréscimo de várias coleções novas

� Coleções no JSE 1.5

� Reforma do JCF

� Adaptações para suporte a tipos genéricos

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Características do JCF

� Arquitetura unificada de componentes

� Suporte a grande variedade de E.D.

� Listas

� Pilhas

� Filas

� Conjuntos

� Mapas

� Facilidade para extensão

� Algoritmos para operações com coleções

� Pesquisa

� Ordenação

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Arquitetura do JCF

� Camada 1: interfaces

� Representam as coleções como TADs

� Manipulação uniforme da coleção (independente de implementação)

� Camada 2: classes abstratas

� São implementações parciais das coleções

� Reduzem o esforço para criação de novas coleções

� Camada 3: classes de implementação

� São classes concretas

� Oferecem uma implementação completa para a interface de uma

coleção

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Hierarquia de interfaces do JCF

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Interface java.util.Collection

� Define os métodos comuns a todas as coleções

� Não possui nenhuma implementação direta

� Permite a manipulação uniforme de diferentes tipos de coleções

� E = elemento

� Tipos de coleções

� java.util.List: representa uma lista

� java.util.Queue: representa uma fila

� java.util.Set: representa um conjunto

� java.util.SortedSet: conjunto com elementos ordenados

� java.util.NavigableSet: conjunto ordenado e navegável

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Interface java.util.Map

� Representa um tipo especial de coleção: o mapa

� Mapeia chave para valores

� Não permite chaves duplicadas

� Parâmetros de tipo

� K: chave (key)

� V: valor (value)

� Tipos de mapas

� java.util.SortedMap: mapa com elementos ordenados

� java.util.NavigableMap: mapa ordenado e navegável

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Hierarquia de classes do JCF

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Implementações para coleções

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Métodos da interface Collection

� boolean add(E e): adiciona um elemento

� void clear( ): remove todos os elementos

� boolean contains(Object o): se a coleção contém o elemento

� Pesquisa utiliza o método equals( ) do objeto

� boolean isEmpty( ): se a coleção está vazia

� Iterator<E> iterator( ): retorna um iterator

� boolean remove(Object o): remove um elemento

� Pesquisa utiliza o método equals( ) do objeto

� int size( ): retorna a quantidade de elementos

� Object[] toArray( ): copia os elementos para um vetor

� T[] toArray(T[] a): copia os elementos para um vetor

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Iterator

� Objeto que controla a navegação por uma coleção

� Só suporta navegação unidirecional

� Métodos da interface java.util.Iterator

� boolean hasNext( ): verifica se ainda há mais um elemento

� E next( ): avança o cursor e retorna o elemento seguinte

� Pode disparar uma java.util.NoSuchElementException

� void remove( ): remove o elemento atual

� Não é suportado por todas as coleções

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Implementações para mapas

� AbstractMap: implementação parcial

� HashMap: implementação completa de um mapa

� TreeMap: implementação de um mapa ordenado e navegável

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Introdução

� Outros componentes importantes do JCF

� classe java.util.Collections: algoritmos para coleções

� classe java.util.Arrays: algoritmos para vetores

� interface java.util.ListIterator: iterator para listas

� interface java.lang.Comparable: critério único para ordenação

� interface java.util.Comparator: múltiplos critérios de ordenação

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Conceito

� Coleção de elementos em seqüência

� Permite elementos duplicados

� Acesso através de índice

� Suporte à pesquisa e ordenação

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Métodos da interface List

� void add(int index, E element): insere o elemento na posição

especificada

� O método add( ) herdado insere no final

� E get(int index): recupera o elemento da posição especificada

� int indexOf(Object o): retorna o índice da primeira ocorrência

� int lastIndexOf(Object o): retorna o índice da última ocorrência

� ListIterator<E> listIterator( ): retorna um iterator que inicia a

navegação no início da lista

� ListIterator<E> listIterator(int index): retorna um iterator que

inicia a navegação na posição especificada

� E remove(int index): remove o elemento da posição especificada

� E set(int index, E element): substitui o elemento da posição

especificada

� List<E> subList(int fromIndex, int toIndex): retorna uma lista

composta por parte dos elementos

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Métodos da interface ListIterator

� void add(E e): inclui o elemento na posição anterior ao cursor

� boolean hasPrevious( ): se há um elemento antes do cursor

� int nextIndex( ): retorna o índice do elemento que está após o

cursor

� E previous( ): recupera o elemento anterior e posiciona o cursor

antes dele

� int previousIndex( ): retorna o índice do elemento que está antes

do cursor

� void set(E e): substitui o último elemento retornado pelos

métodos next( ) e previous( )

Obs.: o cursor deste tipo de iterator sempre permanece entre dois

elementos da lista.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Implementações para listas

� Vector

� Disponível desde o JSE 1.0

� Mecanismo de armazenamento: vetor de objetos

� Operações sincronizadas (redução de desempenho)

� Métodos originais coincidentes com métodos da interface List

o addElement( ) = add( )

� ArrayList

� Disponível desde o JSE 1.2

� Mecanismo de armazenamento: vetor de objetos

� Capacidade inicial padrão: 10

� Redimensionamento: cópia dos elementos para um vetor maior

� Operações não sincronizadas (aumento de desempenho)

� ArrayList(int initialCapacity): capacidade inicial customizada

� ensureCapacity(int minCapacity): garante uma capacidade mínima

� trimToSize( ): elimina posições não ocupadas

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Implementações para listas

� LinkedList

� Disponível desde o JSE 1.2

� Mecanismo de armazenamento: lista duplamente encadeada

� Implementação completa da interface List

� Uniformidade na recuperação, inserção e remoção de elementos

o Controle nas duas extremidades

� Outras aplicações: pilhas e filas

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Exemplos

Contato

-

-

nome

email

: String

: String

+

+

+

+

+

+

+

+

+

Contato ()

Contato (String nome, String email)

getNome ()

getEmail ()

setNome (String nome)

setEmail (String email)

toString ()

equals (Object obj)

hashCode ()

: String

: String

: void

: void

: String

: boolean

: int

ExemploCollection

- colecao : Collection<Contato>

+

-

main (String args[])

exibirEstado ()

: void

: void

ExemploListaInclusao

- lista : List<Contato>

+

-

-

main (String args[])

incluir (int posicao)

relatorio ()

: void

: void

: void

ExemploArrayList

- lista : List<Contato>

+

-

-

-

-

-

main (String args[])

incluir ()

excluir ()

alterar ()

consultar ()

relatorio ()

: void

: void

: void

: void

: void

: void

ExemploLinkedList

- lista : LinkedList<Contato>

+

-

-

-

-

main (String args[])

incluir ()

excluir ()

consultar ()

relatorio ()

: void

: void

: void

: void

: void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Código 21.1 – Contato.java

� public boolean equals( )

if (obj == null) return false;

if (getClass() != obj.getClass()) return false;

if (this == obj) return true;

final Contato other = (Contato) obj;

if (nome == null && other.nome != null) return false;

if (nome != null && other.nome == null) return false;

if (!nome.equals(other.nome)) return false;

return true;

� public int hashCode( )

return 31 + ((nome == null) ? 0 : nome.hashCode());

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Código 21.2 – ExemploCollection.java

� Atributo: lista de contatos (ArrayList)

� exibirEstado( ): indicar estado e tamanho da lista

� main( ):

� Permitir o registro de um número indefinido de contatos

� Não permitir o registro de dois contatos com o mesmo nome

o Exibir mensagem de erro

� Recuperar a lista de contatos com um foreach

� Recuperar a lista de contatos com um iterator

� Exibir o estado da coleção

� Esvaziar a coleção

� Exibir novamente o estado da coleção

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Código 21.3 – ExemploListaInclusao.java

� Atributo: lista de contatos (ArrayList)

� incluir(int posicao)

� Permitir a inclusão de um contato na lista

� Incluir na posição especificada

� Não permitir o registro de dois contatos com o mesmo nome

� relatorio( )

� Exibir a lista de contatos registrados

� main( ):

� Exibir um diálogo com as três opções do aplicativo

� Executar o método correspondente

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Código 21.4 – ExemploArrayList.java

� Atributo: lista de contatos (ArrayList)

� incluir(): incluir contato no final da lista

� Não permitir nome duplicado

� excluir(): excluir contato com base no nome informado

� Exibir mensagem de confirmação com dados do contato excluído

� Se o nome não for encontrado, exibir mensagem de erro

� alterar(): alterar o e-mail de um contato com base no nome

� Exibir mensagem de confirmação

� Se o nome não for encontrado, exibir mensagem de erro

� consultar(): consultar um registro com base no nome

� Se o nome não for encontrado, exibir mensagem de erro

� relatorio(): exibir a lista de contatos registrados

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Métodos da classe LinkedList

� E getFirst( ): retorna o primeiro elemento

� E getLast( ): retorna o último elemento

� E removeFirst( ): remove o primeiro elemento

� E removeLast( ): remove o último elemento

� void addFirst(E e): insere elemento no início

� void addLast(E e): insere elemento no final

� boolean removeFirstOccurrence(Object o): remove a primeira

ocorrência do objeto especificado

� boolean removeLastOccurrence(Object o): remove a última

ocorrência do objeto especificado

� Iterator<E> descendingIterator( ): retorna um iterator para

navegar do final para o início da lista

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Listas

� Código 21.5 – ExemploLinkedList.java

� Atributo: lista de contatos

� incluir(): permitir a escolha do local de inclusão (Início ou Final)

� excluir(): permitir a escolha do local da exclusão

� Se a lista estiver vazia, exibir mensagem de erro

� consultar(): permitir a escolha do local da consulta

� Se a lista estiver vazia, exibir mensagem de erro

� relatorio(): exibir a lista de contatos na ordem inversa

� Utilizar um iterator descendente para recuperar elementos

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Pilhas

� java.util.Stack

� Disponível desde o JSE 1.0

� Derivada de java.util.Vector

� Sincronizada = menos eficiência

� Estrutura poluída: métodos herdados

� java.util.LinkedList

� Disponível desde o JSE 1.2

� Não sincronizada = mais eficiência

� Métodos uniformes

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Pilhas

� Código 21.6 – ExemploPilha.java

� Atributo: pilha de textos

� main()

� Capte qualquer número de textos e insira-os na pilha (push)

� Percorra a pilha, recupere e remova todos os seus elementos (pop)

� Exiba uma mensagem com todos os textos recuperados

ExemploPilha

- pilha : LinkedList<String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Filas

� Código 21.7 – ExemploFila.java

� Atributo: fila de textos

� main()

� Capte qualquer número de textos e insira-os na fila (add)

� Percorra a fila, recupere e remova todos os seus elementos (remove)

� Exiba uma mensagem com todos os textos recuperados

ExemploFila

- fila : LinkedList<String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Filas

� Métodos da interface java.util.Queue

� boolean add(E e): inclui elemento no final da fila

� boolean offer(E e): inclui elemento no final da fila

� E remove( ): remove elemento do início da fila

� E pool( ): remove elemento do início da fila

� E element( ): recupera primeiro elemento

� E peek( ): recupera primeiro elemento

� Resultado na falha dos métodos

� Lançam exceções: add( ), remove( ) e element( )

� Retornam valor especial: offer( ), pool( ) e peek( )

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Filas

� Classe java.util.PriorityQueue

� Representa uma fila de prioridade

� Elementos ordenados de acordo com um critério

� Determinação do critério de ordenação

� Opção 1: objetos realizam a interface Comparable

� O método compareTo( ) é utilizado

� Opção 2: uso de um comparador

� Comparador informado ao construtor da fila

� O método compare( ) é utilizado

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Filas

� Exemplo de fila de prioridade

� Fila de pacientes

� Critérios de ordenação:

� Primário: gravidade do estado de saúde

� Secundário: ordem de chegada (número da ficha)

gravidade

<<Enum>>

Gravidade

+

+

+

+

+

-

-

MINIMA

PEQUENA

MEDIA

ALTA

ALTISSIMA

indicador

descricao

: EnumConstant

: EnumConstant

: EnumConstant

: EnumConstant

: EnumConstant

: int

: String

= 1,"Mínima"

= 2,"Pequena"

= 3,"Média"

= 4,"Alta"

= 5,"Altíssima"

*

+

+

Gravidade (int indicador, String descricao)

getIndicador ()

getDescricao ()

: int

: String

Paciente

-

-

-

ficha

nome

gravidade

: int

: String

: Gravidade

+

+

+

+

+

setFicha (int ficha)

setNome (String nome)

setGravidade (Gravidade gravidade)

toString ()

compareTo (Paciente outro)

: void

: void

: void

: String

: int

ExemploFilaPrioridade

- fila : Queue<Paciente>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Filas

� Código 21.8 – Gravidade.java

� Enumeração utilizada para classificar a gravidade do estado de

saúde dos pacientes.

� Código 21.9 – Paciente.java

� Representa o registro de chegada de cada paciente.

� Atributos:

� ficha: número que identifica a ordem de chegada

� nome: nome completo do paciente

� gravidade: a gravidade de seu estado de saúde

� Métodos:

� toString( ): Ficha nº <ficha>: <nome> (Gravidade <descrição>)

� compareTo( ): define os critérios de ordenação (gravidade/chegada)

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Filas

� Código 21.10 – ExemploFilaPrioridade.java

� Permita o registro de qualquer quantidade de pacientes

� Solicite o nome e a prioridade como nos diálogos abaixo

� Utilize um contador para gerar o número da ficha

� Ao final, recupere e remova todos os elementos da fila

� Exiba uma mensagem com todos estes elementos

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Conjuntos

� Conceito

� Coleção que não pode ter duplicatas

� Abstração dos conjuntos matemáticos

� API

Set

<E>

Collection

<E>

SortedSet

<E>

NavigableSet

<E>

HashSet<E>

TreeSet<E>

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Conjuntos

� Código 21.11 – ExemploHashSet.java

� Crie o conjunto como uma instância da classe HashSet

� Permita a inclusão de qualquer quantidade de itens de compra

� Experimente inserir itens repetidos

� Ao final, liste todos os itens gravados (utilize um laço foreach)

ExemploHashSet

- conjunto : Set<String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Conjuntos

� Código 21.12 – ExemploTreeSet.java

� Crie o conjunto como uma instância da classe TreeSet

� Permita a inclusão de qualquer quantidade de itens de compra

� Experimente inserir itens repetidos

� Ao final, liste todos os itens gravados (utilize um laço foreach)

ExemploTreeSet

- conjunto : Set<String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Mapas

� Conceito

� Coleção que vincula chaves a valores

� Chaves não podem ser duplicadas

� API

Map

<K,V>

NavigableMap

<K,V>

SortedMap

<K,V>

AbstractMap<K,V>

{abstract}

TreeMap<K,V> HashMap<K,V>

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Mapas

� Métodos da interface java.util.Map

� V get(Object key): retorna o valor associado à chave indicada

� V put(K key, V value): adiciona um par de chave/valor

� Set<K> keySet( ): retorna o conjunto de chaves do mapa

� V remove(Object key): remove a entrada correspondente à chave

� int size( ): retorna o número de elementos

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Mapas

� Código 21.13 – ExemploHashMap.java

� Crie o mapa como uma instância da classe HashMap

� Permita a inclusão de qualquer quantidade de siglas e dos

significados correspondentes

� Percorra o mapa e recupere todas as siglas e significados

� Crie um conjunto (TreeSet) com as chaves do mapa

� Utilize um laço foreach para percorrer o conjunto

ExemploHashMap

- mapa : Map<String, String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Mapas

� Código 21.14 – ExemploTreeMap.java

� Crie o mapa como uma instância da classe TreeMap

� Permita a inclusão de qualquer quantidade de siglas e dos

significados correspondentes

� Percorra o mapa e recupere todas as siglas e significados

� Crie um conjunto (Set) com as chaves do mapa

� Utilize um laço foreach para percorrer o conjunto

ExemploTreeMap

- mapa : Map<String, String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Ordenação de Listas

� Métodos estáticos da classe java.util.Collections

<T extends Comparable<? super T>> void sort(List<T> list)

<T> void sort(List<T> list, Comparator<? super T> c)

<T> Comparator<T> reverseOrder( )

void reverse(List<?> list)

void shuffle(List<?> list)

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Ordenação de Listas

� Código 21.15 – OrdenacaoSimples.java

� Crie uma nova lista (LinkedList)

� Permita a inclusão de qualquer quantidade de textos

� Ordene os elementos após a inclusão de todos

� Recupere e apresente a lista de todos os elementos da lista

OrdenacaoSimples

- lista : List<String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Ordenação de Listas

� Código 21.16 – OrdenacaoInversa.java

� Crie uma nova lista (LinkedList)

� Permita a inclusão de qualquer quantidade de textos

� Ordene os elementos após a inclusão de todos

� Ordem alfabética descendente

� Use um comparador

� Recupere e apresente a lista de todos os elementos da lista

OrdenacaoInversa

- lista : List<String>

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Ordenação de Listas

Comparable

<T>

Funcionario

-

-

-

matricula

nome

salario

: int

: String

: double

+

+

...

toString ()

compareTo (Funcionario outro)

...

: String

: int

...

Comparator

(util)

<T>

FunNomeComparator

+ compare (Funcionario func1, Funcionario func2) : int

FunSalarioComparator

+ compare (Funcionario func1, Funcionario func2) : int

OrdenacaoPersonalizada

- lista : List<Funcionario>

+

-

-

-

-

-

main (String args[])

incluir ()

ordenar ()

inverter ()

desordenar ()

exibir ()

: void

: void

: void

: void

: void

: void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Ordenação de Listas

� Código 21.17 – Funcionario.java

� toString( ): Funcionário <matrícula>: <nome> <salário>

� compareTo( ): ordenação padrão (pela matrícula)

� Código 21.18 – FunNomeComparator.java

� compare( ): ordenação pelo nome

� Código 21.19 – FunSalarioComparator.java

� compare( ): ordenação pelo salário

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Ordenação de Listas

� Código 21.20 – OrdenacaoPersonalizada.java

� Instanciação do atributo: LinkedList

� main(): exibir opções e invocar métodos correspondentes

� incluir( ): permitir a inclusão de qualquer número de registros

� ordenar( ): ordenar com base em opção do usuário

� inverter( ): inverter a ordem dos registros

� desordenar( ): reorganizar aleatóriamente os registros

� exibir( ): apresentar a lista de funcionários registrados

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Pesquisa Binária em Listas

� Métodos estáticos da classe java.util.Collections

<T> int binarySearch(List<? extends Comparable<? super T>> list,

T key)

� O retorno é a posição da chave (ou -1)

� Os elementos devem realizar a interface comparable

� Os elementos devem estar ordenados pela ordem natural

<T> int binarySearch(List<? extends T> list, T key,

Comparator<? super T> c)

� O retorno é a posição da chave (ou -1)

� Os elementos devem estar ordenados de acordo com o comparador

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Pesquisa Binária em Listas

� Código 21.21 – ExemploPesquisaBinaria.java

� Instanciação do atributo: LinkedList

� main(): exibir opções e invocar métodos correspondentes

� incluir( ): permitir a inclusão de qualquer número de registros

� pesquisar( ): exibir as opções de pesquisa e invocar os métodos

correspondentes

� Métodos: pesquisarPelaMatricula( ), pesquisarPeloNome( ) e

pesquisarPeloSalario( ).

� Se a chave for localizada, apresentar a posição em que se encontra

� Se a chave não for localizada, exibir uma mensagem de erro

� exibir( ): apresentar a lista de funcionários registrados

ExemploPesquisaBinaria

- lista : List<Funcionario>

+

-

-

-

-

-

-

main (String args[])

incluir ()

pesquisar ()

pesquisarPelaMatricula ()

pesquisarPeloNome ()

pesquisarPeloSalario ()

exibir ()

: void

: void

: void

: void

: void

: void

: void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Estatísticas de Coleções

� Métodos estáticos da classe java.util.Collections

min(): recupera o menor valor de uma coleção

max( ): recupera o maior valor de uma coleção

frequency( ): frequencia de um objeto dado na coleção

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Estatísticas de Coleções

� Código 21.22 – ExemploEstatisticas.java

� Instanciação do atributo: LinkedList

� main(): exibir opções e invocar métodos correspondentes

� incluir( ): permitir a inclusão de qualquer número de registros

� verLimites( ): exibir o menor e o maior salário

� verFrequencias( ): exibir os diferentes salários recebidos pelos

funcionários cadastrados e a quantidade de funcionários que

recebe cada um deles

� exibir( ): apresentar a lista de funcionários registrados

ExemploEstatisticas

- lista : List<Funcionario>

+

----

main (String args[])

incluir ()verLimites ()verFrequencias ()exibir ()

: void

: void: void: void: void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Manipulação de Vetores

� Métodos estáticos da classe java.util.Arrays

� copyOf(): cria uma cópia de um vetor com nova capacidade

� sort( ): ordena os elementos de um vetor

� binarySearch( ): realiza uma pesquisa binária

� Algumas implementações destes métodos

public static <T> T[] copyOf(T[] original, int newLength)

public static void sort(Object[] a)

public static <T> void sort(T[] a, Comparator<? super T> c)

public static int binarySearch(Object[] a, Object key)

public static <T> int binarySearch(T[] a, T key,

Comparator<? super T> c)

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Manipulação de Vetores

� Código 21.23 – ExemploVetor.java

� Inicialmente, instancie o vetor com apenas 2 posições

� Permita que o usuário grave quantos textos desejar neste vetor

� Dobre a capacidade do vetor sempre que ela for ultrapassada

� Após as inclusões, elimine as posições desocupadas

� Ordene os textos informados

� Exiba uma mensagem com o conteúdo do vetor

� Inicie um procedimento para a realização de pesquisas

� Se o texto for encontrado, indique a sua posição no vetor

� Caso contrário, indique que ele não foi encontrado

ExemploVetor

- textos : String[]

+ main (String args[]) : void

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 1

� Crie uma classe, chamada Aluno e dois comparadores para

ela, chamados AlunoNomeComparator e

AlunoNascimentoComparator.

� Procure implementar estas três classes em conformidade com as

especificações contidas no diagrama de classes que é

apresentado pela figura abaixo.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 1

� Os métodos de escrita dos três atributos da classe Aluno

devem validar os dados recebidos antes de gravá-los.

� Se um dado inválido for recebido por algum destes métodos, ele

deve disparar uma exceção com uma mensagem que indique a

regra que foi violada.

� Defina você mesmo as regras que serão aplicadas para validar os

dados relativos a cada um dos atributos.

� Implemente o método equals( ) da classe Aluno de forma que

duas instâncias desta classe sejam consideradas iguais

sempre que tiverem o mesmo valor no atributo que

representa a matrícula do aluno.

� Este atributo também deve ser utilizado na implementação do

método hashCode( ) de tal forma que dois alunos com a mesma

matrícula também gerem o mesmo código de hash.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 1

� O método compareTo( ) deve ser implementado pela classe

Aluno em função de ter se comprometido a realizar a

interface Comparable.

� Este método define a ordenação natural das instâncias desta

classe.

� Implemente este método de forma que ele ordene os objetos

desta classe com base na matrícula dos alunos.

� As classes AlunoNomeComparator e

AlunoNascimentoComparator, por sua vez, devem ser

implementadas de tal modo que possam ser empregadas

para realizar a ordenação destes objetos utilizando os

atributos nome e nascimento, respectivamente.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 2

� Crie um novo aplicativo, chamado CadastroAluno, que

permita realizar o cadastro de alunos. O primeiro diálogo

produzido por este aplicativo deve ter as opções que

permitam o acesso a todas as operações suportadas por ele.

A figura abaixo ilustra qual deve ser a aparência deste

diálogo.

� A operação de inclusão consiste em solicitar a matrícula, o

nome e a data de nascimento de um aluno, gravar todos

estes dados em uma instância da classe Aluno e adicionar

esta instância a uma coleção.

� Se um dos dados informados for inválido, o aplicativo deve exibir

uma mensagem de erro e solicitá-lo novamente.

� Se já houver um aluno cadastrado com a matrícula informada, o

aplicativo deve exibir uma mensagem de erro e encerrar a

operação.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 2

� A operação de exclusão consiste em solicitar a matrícula de um aluno e excluir o objeto correspondente da coleção.

� Se a coleção estiver vazia, uma mensagem de erro deve ser exibida e esta operação deve ser encerrada.

� Se a matrícula informada não for válida, uma mensagem de erro deve ser exibida e ela deve ser solicitada novamente.

� Se não houver nenhum aluno cadastrado com a matrícula informada, deve ser exibida uma mensagem de erro e a operação deve ser encerrada.

� A operação de alteração consiste em solicitar a matrícula de um aluno, em localizar a posição onde seu cadastro foi gravado na coleção e permitir que seu nome e sua data de nascimento sejam atualizados.

� Se não houver nenhum cadastro gravado, o aplicativo deve exibir uma mensagem de erro e encerrar a operação.

� Se um dado inválido for informado, o aplicativo deve exibir uma mensagem de erro e solicitá-lo novamente.

� Se não houver nenhum aluno cadastrado com a matrícula informada, uma mensagem de erro deve ser exibida e a operação deve ser encerrada.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 2

� A operação de consulta consiste em solicitar a matrícula de

um aluno, em recuperar seu nome e data de nascimento e

apresentá-los através de uma mensagem.

� Se não houver nenhum cadastro gravado, o aplicativo deve exibir

uma mensagem de erro e encerrar a operação.

� Se a matrícula informada for inválida, uma mensagem de erro

deve ser exibida e ela deve ser solicitada novamente.

� Se não houver nenhum aluno cadastrado com a matrícula

informada, uma mensagem de erro deve ser exibida e a operação

deve ser encerrada.

� A operação de ordenação consiste em permitir que se

escolha uma opção de ordenação para os cadastros de

alunos que se encontram gravados na coleção.

� Se não houver nenhum cadastro gravado, o aplicativo deve exibir

uma mensagem de erro e encerrar a operação.

� Deve-se permitir a escolha de uma de três opções: ordená-los

pela matrícula, pelo nome ou pela data de nascimento.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 2

� O relatório deve apresentar os dados de todos os alunos

cadastrados através de uma mensagem gráfica.

� Se não houver nenhum cadastro gravado, uma mensagem de erro

deve ser exibida e a operação deve ser encerrada.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 3

� Crie um novo aplicativo, chamado SorteioNumeros, que

realize o sorteio de dez números inteiros.

� Os números sorteados devem ser exibidos através de uma

mensagem gráfica similar à que é ilustrada pela figura abaixo.

� Os números sorteados não podem ser inferiores a 101 e não

podem ser superiores a 200.

� Não deve ser permitido que um mesmo número seja incluído

duas vezes no resultado do sorteio.

� Estes números devem ser apresentados em ordem crescente.

� Armazene os números sorteados em um tipo de coleção que

facilite a realização desta operação.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 4

� Crie um novo aplicativo, chamado ValidadorDelimitadores,

que capte uma expressão qualquer e indique se todos os

delimitadores abertos foram fechados adequadamente. A

figura abaixo ilustra o seu funcionamento.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Exercício 4

� A expressão deverá ser informada através de um diálogo

gráfico.

� Somente três tipos de delimitadores devem ser analisados por

este aplicativo: chaves, colchetes e parênteses.

� Qualquer outro caractere deve ser ignorado para fins de

avaliação da expressão.

� Utilize uma pilha de caracteres para implementar a solução

para o problema proposto.

� Adicione cada delimitador de abertura que for encontrado a esta

pilha.

� Sempre que um delimitador de fechamento for encontrado na

expressão, verifique se o delimitador de abertura correspondente

se encontra no topo da pilha.

� Caso eles não coincidam, registre o erro.

� Se um delimitador de fechamento for encontrado quando a pilha

estiver vazia ou se não houver nenhum delimitador de fechamento

para um delimitador de abertura, registre o erro.

Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Contato

Com o autor:

Rui Rossi dos Santos

E-mail: [email protected]

Web Site: http://www.ruirossi.pro.br

Com a editora:

Editora NovaTerra

Telefone: (21) 2218-5314

Web Site: http://www.editoranovaterra.com.br