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