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