Coleções - Rui Rossi dos Santos

Propaganda
Capítulo 21
Coleçõ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
ExemploCollection
- colecao : Collection<Contato>
+ main (String args[]) : void
- exibirEstado ()
: void
ExemploListaInclusao
- lista : List<Contato>
+ main (String args[]) : void
- incluir (int posicao) : void
- relatorio ()
: void
Contato
- nome : String
- email : 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
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[]) : void
- incluir ()
: void
: void
- excluir ()
- consultar ()
: void
- relatorio ()
: 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
+
+
+
+
+
*
+
+
Paciente
MINIMA
: EnumConstant = 1,"Mínima"
PEQUENA : EnumConstant = 2,"Pequena"
MEDIA
: EnumConstant = 3,"Média"
ALTA
: EnumConstant = 4,"Alta"
ALTISSIMA : EnumConstant = 5,"Altíssima"
indicador : int
descricao : String
Gravidade (int indicador, String descricao)
getIndicador ()
: int
getDescricao ()
: String
- ficha
: int
- nome
: String
- gravidade : 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
<E>
Collection
<E>
HashSet<E>
Set
<E>
SortedSet
Rui Rossi dos Santos
<E>
NavigableSet
TreeSet<E>
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
<K,V>
AbstractMap<K,V>
{abstract}
Map
<K,V>
SortedMap
<K,V>
NavigableMap
Rui Rossi dos Santos
TreeMap<K,V>
HashMap<K,V>
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
<T>
FunNomeComparator
Comparable
+ compare (Funcionario func1, Funcionario func2) : int
OrdenacaoPersonalizada
Funcionario
- matricula : int
- nome
: String
- salario
: double
+ toString ()
: String
+ compareTo (Funcionario outro) : int
... ...
...
- lista : List<Funcionario>
+ main (String args[]) : void
- incluir ()
: void
- ordenar ()
: void
- inverter ()
: void
- desordenar ()
: void
- exibir ()
: void
<T>
Comparator
(util)
FunSalarioComparator
+ compare (Funcionario func1, Funcionario func2) : int
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 ()
Rui Rossi dos Santos
:
:
:
:
:
:
:
void
void
void
void
void
void
void
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[]) : void
- incluir ()
: void
: void
- verLimites ()
- verFrequencias () : void
- exibir ()
: 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
Rui Rossi dos Santos
Programação de Computadores em Java
Editora NovaTerra
Download