Framework de Coleções Java PDF
Document Details
Uploaded by ForemostRadon
Tags
Summary
Este documento fornece uma introdução ao Framework de Coleções do Java (JCF). Explora conceitos como iteradores, comparadores e diferentes tipos de coleções, apresentando exemplos e diagramas de classes.
Full Transcript
Framework de Coleções do Java (JCF) Java Collections Framework, Iteradores, Comparadores, Conjuntos, Listas, Filas, Dicionários… Algoritmos e Estrutura de Dados 1 Iteradores Um iterador é um objeto que permite ao programador percorrer os elementos de uma coleçã...
Framework de Coleções do Java (JCF) Java Collections Framework, Iteradores, Comparadores, Conjuntos, Listas, Filas, Dicionários… Algoritmos e Estrutura de Dados 1 Iteradores Um iterador é um objeto que permite ao programador percorrer os elementos de uma coleção, sem precisar de perceber como esses elementos se encontram organizados internamente. Do ponto de vista semântico, podemos ver um iterador como sendo um apontador inteligente, que em cada momento aponta para um dos elementos contidos na coleção, dispondo, por isso, de métodos que asseguram duas operações essenciais: o acesso a um elemento particular da coleção (o referenciado); a modificação do estado do próprio iterador que o leve a referenciar o elemento seguinte na coleção; Deve também existir uma forma de pôr um iterador a apontar para o primeiro elemento, e uma maneira de verificar se o iterador chegou ou não ao fim da coleção. Framework de Coleções do Java 2 Algoritmos e Estrutura de Dados Iteradores O principal objetivo do iterador é então permitir que o utilizador aceda a cada elemento sem precisar de conhecer a estrutura interna de uma coleção. Permite que a coleção armazene os elementos como bem entender e, ainda assim, o utilizador a trate como se fosse uma simples lista ou sequência. Em Java, os iteradores apresentam uma interface base comum, mas são implementados em função da estrutura interna da coleção que terão que saber percorrer Podemos mesmo afirmar que cada iterador fica especializado em percorrer apenas um tipo particular de coleção. Com esta abordagem, torna-se mesmo possível criar vários iteradores para percorrerem em simultâneo uma mesma coleção. Framework de Coleções do Java 3 Algoritmos e Estrutura de Dados A interface Iterator do Java De modo a uniformizar a forma como os objetos interagem, o Java define a interface parametrizada java.util.Iterator, com os seguintes métodos: hasNext(): devolve true se existir pelo menos um elemento adicional na coleção; next(): devolve o próximo elemento da coleção (e faz também avançar o iterador para o elemento seguinte). remove(): método opcional que remove o último elemento devolvido pelo iterador – apenas pode ser invocado uma vez por cada invocação do next(). Por exemplo, a classe Scanner implementa a interface Iterator, com o método next() a devolver uma String. Se o método for invocado sem existirem elementos adicionais, é lançada a exceção NoSuchElementException Para a evitar, devemos sempre verificar se existem mais elementos, com o método hasNext(), antes de cada invocação do método next(). Estes dois métodos do iterador permitem-nos construir um ciclo para processar sequencialmente todos os elementos duma coleção: while (iter.hasNext()) { E value = iter.next(); System.out.println(value); } Framework de Coleções do Java 4 Algoritmos e Estrutura de Dados A interface Iterable O Java contém outra interface parametrizada (genérica), designada Iterable, que contém um método único: iterator(): devolve um objeto iterador para os elementos da coleção; Uma qualquer coleção do Java (da biblioteca JCF) é iterável, mas não é ela própria um iterador implementa, por isso, a interface Iterable; devolvendo, através do seu método iterator(), um objeto iterador para os seus elementos, o qual já está a referenciar o primeiro deles. Cada invocação do método iterator() da coleção, devolve um novo objeto iterador, possibilitando assim múltiplas iterações em simultâneo da mesma coleção. Framework de Coleções do Java 5 Algoritmos e Estrutura de Dados O ciclo for-each A interface Iterable desempenha também um papel fundamental na estrutura for-each. A seguinte sintaxe apenas é válida para um objeto (collection) que seja iterável, ou seja, que implemente a interface Iterable. ElementType deve ser do tipo do elemento devolvido pelo seu iterador. O ciclo for-each anterior é equivalente a: Framework de Coleções do Java 6 Algoritmos e Estrutura de Dados Framework de Coleções do Java (JCF) O Java disponibiliza-nos um conjunto vasto de interfaces e classes, organizadas hierarquicamente, que conjuntamente formam o Java Collections Framework (JCF) essa framework faz parte do package java.util; admite a super-interface Collection, que serve de raiz a outras interfaces da JCF, representa uma interface geral, comum às várias coleções; inclui métodos como: add( ), remove( ), size( ), isEmpty( ), iterator( ); A JCF inclui, para além das interfaces, classes abstratas e concretas, que implementam as várias interfaces e que representam diferentes tipos de coleções. Todas as coleções da JCF são dinâmicas (crescem à medida que for necessário) e têm a particularidade de apenas colecionarem objetos essa restrição advém do facto de serem classes genéricas, com um parâmetro E representando o tipo do elemento colecionado; e, como se sabe, um parâmetros tipo representa uma classe, não um tipo primitivo; mas isso não representa mal de maior, uma vez que qualquer valor primitivo é automaticamente convertido num objeto da classe Wrapper correspondente (auto boxing) Existe ainda a classe Collections (no plural) que possui um conjunto de métodos estáticos úteis para manipular coleções A classe Collections está para as coleções do Java assim como a classe Arrays está para os arrays. Framework de Coleções do Java 7 Algoritmos e Estrutura de Dados Diagrama de classes da JCF Map A JCF inclui também várias classes abstratas, não mostradas no SortedMap HashMap diagrama, com Iterable implementações parciais das interfaces. TreeMap LinkedHashMap Collection Set List Queue HashSet ArrayList Vector PriorityQueue SortedSet Deque LinkedHashSet TreeSet Stack LinkedList ArrayDeque Framework de Coleções do Java 8 Algoritmos e Estrutura de Dados Métodos da interface Collection adiciona um elemento (objeto da classe E) à coleção, boolean add(E) devolvendo true se a operação for bem sucedida remove um elemento da coleção, devolvendo true se a boolean remove(E) operação for bem sucedida boolean contains(E) devolve true se o elemento existir na coleção int size() devolve o número de elementos presentes na coleção boolean isEmpty() devolve true se a coleção estiver vazia void clear() elimina todos os elementos da coleção devolve um objeto do tipo Iterator, que referencia o Iterator iterator() primeiro elemento da coleção adiciona à coleção todos os elementos de outra coleção, devolvendo true se a operação for bem boolean addAll(Collection) sucedida; //Cuidado: este método copia apenas as referências dos objetos colecionadas retira da coleção todos os elementos de outra coleção, boolean removeAll(Collection) devolvendo true se a coleção for alterada devolve true se a coleção contém todos os elementos boolean containsAll(Collection) de outra coleção Framework de Coleções do Java 9 Algoritmos e Estrutura de Dados Coleções ordenadas da JCF Tipo Coleção Ordem de Ordem dos Para lidarmos com a JCF, convém diferenciarmos Inserção elementos dois tipos de ordenação HashSet nas suas coleções: Set LinkedHashSet X Coleções ordenadas (conjunto) por ordem de inserção TreeSet X os elementos ArrayList X encontram-se dispostos pela ordem List LinkedList X com que foram inseridos; (lista) Vector X Coleções ordenadas Stack X pelo valor dos LinkedList X elementos Queue os elementos PriorityQueue X encontram-se (fila) ordenados em função ArrayDeque X do seu valor e de acordo com um HashMap determinado critério. Map LinkedHashMap X (dicionário) TreeMap X Framework de Coleções do Java 10 Algoritmos e Estrutura de Dados Tornar os objetos a colecionar comparáveis Nas coleções ordenadas pelo valor dos seus elementos, os elementos encontram-se dispostos por ordem crescente ou decrescente dos seus valores. Quando se trata de tipos primitivos (char, int, float, …) é fácil perceber qual é essa ordem (e esses, como sabe, nem são colecionáveis) mas tratando-se de objetos (que são as entidade que efetivamente são colecionadas), nem sempre existirá uma ordem implícita entre eles (que significado terá o objeto ‘aluno1’ ser menor que o objeto ‘aluno2’, ambos instâncias da classe Aluno?). Assim, sempre que pretendamos colecionar de forma ordenada (pelo valor dos elementos) instancias de classes nossas, devemos primeiramente torná-las comparáveis: implementando nelas a interface Comparable, do package java.lang; o que implicará a implementação do método compareTo(E). Já se pretendermos colecionar de forma ordenada instancias de classes de terceiros, que não sejam comparáveis, então, para não termos que mexer nessas classes, a solução passa por criarmos um objeto auxiliar que sirva de comparador: devendo, para isso, a sua classe implementar a interface Comparator, do package java.util; que a obrigará a ter que definir o método compare(E, E). Framework de Coleções do Java 11 Algoritmos e Estrutura de Dados As interfaces Comparable e Comparator Suponhamos que pretendemos guardar numa das coleções ordenadas da JCF, um conjunto de objetos da classe E. Somos então obrigados a implementar uma das seguintes interfaces: java.lang.Comparable (é a classe E que terá que implementar esta interface) esta interface impõe uma relação de ordem aos objetos da classe E que a implemente; conhecida como ‘ordem natural’, ou intrínseca, da classe; contém o método compareTo(E), responsável por estabelecer essa ordem. é o objeto a colecionar que passa a ser comparável; No exemplo que se segue, os alunos passam a ser comparáveis. public class Aluno implements Comparable{ private int num; … public int compareTo(Aluno outro) {return num-outro.num;} } java.util.Comparator (será uma classe auxiliar a implementar esta interface) esta interface torna os objetos da classe que a implemente comparadores de objetos tipo E; contém o método compare(E, E), responsável por estabelecer a comparação. No exemplo que se segue, podemos afirmar que a classe ComparadorAlunos sabe comparar objetos da classe Aluno. public class ComparadorAlunos implements Comparator{ public int compare(Aluno a1, Aluno a2) { return a1.getNum()-a2.getNum(); } } Framework de Coleções do Java 12 Algoritmos e Estrutura de Dados Os métodos compareTo() e compare() int compareTo(E obj) é um método que deverá ser implementado na classe dos objetos a colecionar, de modo a torná-los comparáveis; à semelhança do método compareTo() da classe String, deverá devolver um inteiro com o seguinte significado: < 0, se o objeto atual for menor que obj; = 0, se forem iguais; > 0, se o objeto atual for maior que obj; int compare(E obj1, E obj2) é um método que deverá ser implementado na classe comparadora auxiliar, que vai saber comparar objetos da classe E; analogamente, deverá devolver um inteiro com o seguinte significado: < 0, se obj1 for menor que obj2; = 0, se forem iguais; > 0, se obj1 for maior que obj2; Framework de Coleções do Java 13 Algoritmos e Estrutura de Dados Exemplo de colecionamento de objetos comparáveis Definição da classe comparável UC (Unidade Curricular) public class UC implements Comparable{//Unid. Curricular private String name; public UC(String n) {name = n;} public int compareTo(UC outra) { return name.compareTo(outra.name); } public String getName() {return name;} } Criação e utilização duma coleção de unidades curriculares do tipo TreeSet (conjunto suportado por uma estrutura em árvore). TreeSet ucs = new TreeSet(); //ucs: coleção de uc’s ucs.add(new UC("POO")); ucs.add(new UC("AED")); for(UC uc: ucs) System.out.println(uc.getName()); AED POO Framework de Coleções do Java 14 Algoritmos e Estrutura de Dados Exemplo de colecionamento com o auxilio de um objeto comparador Definição da classe não comparável UC (Unidade Curricular) Classe presumivelmente de terceiros que não podemos ou não queremos alterar (não a podemos tornar comparável) public class UC{ private String name; public UC(String n) {name = n;} public String getName() {return name;} } Definição da classe auxiliar que vai saber comparar instâncias de UC public class ComparadorUCs implements Comparator{ public int compare(UC uc1, UC uc2) { return uc1.getName().compareTo(uc2.getName()); } } Criação e utilização duma coleção de unidades curriculares do tipo TreeSet Note-se que neste caso temos que passar o objeto comparador para o construtor da coleção TreeSet; caso contrário a coleção assumirá, erradamente, que os objetos são intrinsecamente comparáveis. TreeSet ucs = new TreeSet(new ComparadorUCs()); ucs.add(new UC("POO")); ucs.add(new UC("AED")); AED for(UC uc: ucs) System.out.println(uc.getName()); POO Framework de Coleções do Java 15 Algoritmos e Estrutura de Dados