65
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Cap Cap í í tulo 21 tulo 21 Cole Cole ç ç ões ões

Capítulo 21 - ruirossi.pro.br · 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

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

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