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
: 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