Escolar Documentos
Profissional Documentos
Cultura Documentos
www.t2ti.com
1
O curso Java Starter surgiu da idia dos trs amigos que trabalham juntos em uma instituio financeira de grande porte.
www.t2ti.com
2
Mdulo
09
O Framework Collections
funcionalidades (colees). esperadas quando
Colees
Dada sua importncia, colees (estruturas de dados) so encontradas em qualquer linguagem de programao e em Java as colees recebem um tratamento especial, neste sentido o framework Collections surgiu com a inteno de formar uma arquitetura unificada para representao e manipulao de colees. Mas o que o framework Collections? o conjunto de implementaes (classes e interfaces) oferecidas no pacote java.util que fornecem as principais trabalha-se com conjuntos de elementos
Legal, mas o que este framework me permite fazer que eu no conseguiria com os vetores (arrays) convencionais? Nada, na verdade todas as funcionalidades implementadas no framework Collections podem ser obtidas atravs de uma implementao prpria, ou seja, voc pode at fazer a sua prpria Lista, Fila ou rvore mas sabe que isto j est pronto e acessvel neste framework, na prtica implementaes prprias so difceis de encontrar afinal de contas tempo um recurso valioso e o reuso um dos pilares da orientao a objetos, lembra-se?. Em sntese, ao utilizarmos as colees j implementadas no pacote java.util, obtemos os seguintes benefcios: Reduo na codificao: Muitas funcionalidades esperadas durante a manipulao de um conjunto de elementos j esto prontas;
Melhor
desempenho
do
programa:
As
implementaes
das
funcionalidades e estruturas de armazenamento foram feitas com o objetivo de fornecerem um desempenho timo;
www.t2ti.com
3
Nesta figura temos as interfaces (razes e ns das rvores) que formam o conjunto de interfaces disponveis. Nas folhas (retngulos com bordas mais espessas) encontramos as classes concretas ou implementaes destas interfaces. Esta arquitetura de interfaces forma o ncleo do Java Framework Collections e todas as classes concretas iro derivar de uma ou mais interfaces. interessante notar que apesar da arquitetura nica as colees derivadas da interface Map no implementam a interface Collection no entanto elas tambm fazem parte do pacote de implementaes Java para colees. A figura apresentada pode ser interpretada da seguinte forma: Um Set, List ou Queue um tipo de Collection, cada um com suas particularidades. J um Map no do mesmo tipo dos demais mas tambm manipula colees de elementos As implementaes de cada ramo esto dividas da seguinte forma: Set: HashSet, LinkedHashSet e TreeSet; List: ArrayList, Vector e LinkedList; Queue: LinkedList e PriorityQueue;
www.t2ti.com
4
Muito interessante tudo isto mas, na prtica, quando devo utilizar uma ou outra implementao? Qual a diferena entra cada uma destas interfaces? A seguir sero explicados, simplificadamente, os principais benefcios obtidos com o uso de cada grupo de interfaces e respectivas implementaes. A compreenso das funcionalidades de cada uma das interfaces e implementaes representa a parte mais importante deste mdulo. Ento vamos l: Set: Representa uma coleo que no pode conter duplicatas,
List: Representa uma coleo ordenada (ordem de insero) e que permite duplicatas; Queue: Parecida com a interface List porm adiciona algumas
funcionalidades, muito utilizada para representar listas de elementos cuja ordem importante, normalmente elementos em ordem de processamento;
Map: um objeto que armazena um elemento e o remove atravs da sua chave, os Maps no aceitam chaves duplicadas.
Ns iniciaremos esta jornada investigando a interface Set porm antes de comearmos precisamos conhecer um pouco dos mtodos equals() e hashcode() da classe Object e suas funes. equals() Quando ns estamos trabalhando com objetos os operadores de igualdade, == e != , podem ter efeitos desastrosos se no forem corretamente aplicados. Quando estes operadores so utilizados, na verdade, o que est sendo comparado a referncia do objeto, isto , esta operao ir retornar verdadeiro (true) apenas se as duas referncias so do mesmo objeto. Um exemplo desta situao o seguinte:
System.out.println(new String("Pedro") == new String("Pedro"));//Imprime false
www.t2ti.com
5
Neste exemplo o resultado obtido ser true, isto acontece pois agora o que est sendo comparado o contedo de cada objeto String, ou seja o valor Pedro. O importante que voc compreenda que ao utilizar os operadores de igualdade, sobre objetos, (== ou !=) o que voc est verificando se as duas referncias fazem aluso ao mesmo objeto. Ao utilizar o mtodo equals() ns estamos verificando se os dois objetos so significativamente iguais (equivalentes). A maioria das coisas (objetos) que importam, no contexto da computao, possuem algum identificador nico ou alguma forma de identificao nica. Ex: Carro placa/renavam, Pessoa CPF, Empresa CNPJ, Fatura cdigo, Nota fiscal nmero/srie, Municpio Cdigo do IBGE, Produto cdigo de barras e etc. Sendo assim ao sobreescrevermos o mtodo equals() devemos observar estes identificadores e implementar o mtodo a fim de realizar os testes de igualdade sobre este(s) atributo(s). A fim de clarificar o que foi dito acompanhe o exerccio a seguir. Exerccio resolvido Crie uma classe que represente notas fiscais com cdigo, valor e data, e sobreescreva o mtodo equals de forma que duas notas fiscais sejam consideradas iguais apenas se seus cdigos forem idnticos. Resoluo: 1. Criar classe NotaFiscal com atributos cdigo, valor e data; 2. Sobreescrever mtodo equals de forma que compare os cdigos.
www.t2ti.com
6
estudos para descobrir a funo do mtodo hashcode(). Cdigos de Hash ou Hashcodes so utilizados para aumentar a performance quando manipulamos grandes quantidades de objetos. Hashcodes* so utilizados para identificar objetos de forma que o acesso a estes se torne mais eficiente. Estes cdigos so gerados por uma funo de
* Para saber mais visite http://pt.wikipedia.org/wiki/Tabela_de_hashing
www.t2ti.com
7
Algumas definies
Ordenao: Define que a coleo possui algum tipo de ordem determinada por regra(s). Ex: Crescente, decrescente, prioridade e etc. Organizao: Garante que a coleo sempre percorrida em uma determinada seqncia no aleatria. Ex: Ordem de insero, ndice e etc. Durante a explicao das colees estas definies ficaro mais claras.
SET
Um duplicatas so Set, ou seja, qualquer do implementao mtodo equals(), desta logo, interface, qualquer
obrigatoriamente, no aceita duplicatas em seu conjunto de elementos. Estas identificadas atravs implementao desta interface (Set) altamente dependente de uma correta
www.t2ti.com
8
Mtodo
add( Objeto ) remove( Objeto ) iterator() size()
Descrio
Adiciona um elemento ao nosso Set, retorna true se o elemento foi inserido Remove o elemento da nossa coleo, retorna true se o elemento foi removido Retorna um objeto do tipo Iterator Retorna um int (inteiro) com a quantidade de elementos da coleo Elimina todos os elementos do Set
HashSet
Uma das implementaes concretas da interface Set. O HashSet
caracteriza-se por no aceitar duplicatas, caracterstica derivada do Set, ser uma coleo desordenada e desorganizada, isto , no h nenhuma garantia quanto a ordem que os elementos sero percorridos. O HashSet utiliza o hashcode como chave de identificao de cada um dos seus elementos ento, quanto mais eficiente for a funo de espalhamento mais eficiente ser a sua pesquisa e no entanto, se o mtodo hashCode() no respeitar a implementao do mtodo equals() poderemos ter elementos duplicatas no nosso Set. A seguir ser apresentada a utilizao do HashSet com uma implementao eficiente comparada a uma ineficiente. Exerccio resolvido Utilizando a classe NotaFiscal, desenvolvida no E.R. - 1, sobreescreva o mtodo hashcode() duas vezes, uma utilizando o cdigo e outra retornando sempre o mesmo valor (pior funo de espalhamento possvel afinal de contas no espalha
www.t2ti.com
9
mtodo
hashcode,
utilizar
cdigo
como
funo
de
public class NotaFiscalHashSet { private Integer codigo; private Date dataEmissao; private Double valor; //Construtor parametrizado public NotaFiscalHashSet(Integer codigo, Date dataEmissao, Double valor) { super(); this.codigo = codigo; //atribui o valor do codigo this.dataEmissao = dataEmissao; //atribui a data da emissao this.valor = valor;//atribui o valor } //metodo equals public boolean equals(Object obj) { //Verifica se o objeto da classe NotaFiscal e verifica se os codigos so iguais //Se a resposta for afirmativa para os dois testes retorna verdadeiro (true) if((obj instanceof NotaFiscalHashSet) && ((NotaFiscalHashSet)obj).getCodigo().equals(this.getCodigo())) { return true;// }else { return false; } } //retorna o codigo da nota fiscal public Integer getCodigo() { return codigo; } //metodo hashcode public int hashCode() { return codigo;//funcao de espalhamento retorna o valor do codigo //return 2;//funcao de espalhamento retorna sempre o mesmo valor } //Retorna um long que identifica o tempo atual public static long getTempoAtual() { return Calendar.getInstance().getTimeInMillis();
www.t2ti.com
10
A partir dos resultados temos que, nesta situao, utilizando uma funo de espalhamento mais adeqada o tempo total de pesquisa foi aproximadamente 60 vezes menor do que utilizando a pior funo de hashcode possvel, espalhando para apenas um cdigo.
LinkedHashSet
uma verso organizada do HashSet, lembrando, organizada significa que existe algum tipo de seqncia no-aleatria durante a iterao dos elementos, neste caso a ordem de insero respeitada. Por ser um Set, o LinkedHashSet no aceita duplicatas e, da mesma forma que o HashSet, dependente da correta implementao do mtodo equals(). Devemos utilizar o LinkedHashSet ao invs do HashSet quando a ordem de iterao dos elementos importante. J que falamos de iterao vamos apresentar duas formas de iterao de elementos de colees: utilizando um Iterator; e utilizando o for-each ou enhancedfor.
Iterator: uma interface que fornece poucos mtodos (next(), hasNext() e remove()) porm de muita utilidade quando precisamos percorrer colees. Todas as implementaes do Framework Collections fornecem um Iterator. Os
www.t2ti.com
11
Descrio Retorna true se existe prximo elemento. Retorna o prximo elemento na iterao.
For-Each: um for adaptado a colees e que percorre todos os elementos qualquer de coleo do Framework Collection. A seguir temos um exemplo:
Set carrosHashSet = new HashSet(); for(Carros carro : carrosHashSet) { carro.setPlaca(...); ... }
A estrutura deste for-each poderia ser lida da seguinte forma : Para cada elemento do tipo Carro existente na minha coleo de Carro (carrosHashSet) faa isto; Ns prximos exerccios as duas modalidades de iterao sero utilizadas e a observao do uso prtico facilitar o entendimento. Exerccio resolvido Implemente um mtodo que manipule uma coleo HashSet e outra coleo LinkedHashSet, adicione a elas 20 nmeros inteiros (Integer), em ordem crescente, e percorra todos os elementos, observe se a ordem de iterao a mesma.
import import import import java.util.HashSet; java.util.Iterator; java.util.LinkedHashSet; java.util.Set;
public class IntegerLinkedHashSet { public static void main(String[] args) { Set hashSet = new HashSet();//Criacao do HashSet Set linkedHashSet = new LinkedHashSet(); //Criacao do LinkedHashSet for(int i = 0; i < 20; i++) //For para preencher as duas colecoes { hashSet.add(i); //Adicionando elemento i ao hashSet linkedHashSet.add(i); //Adicionando elemento i ao linkedHashSet } Iterator itHashSet = hashSet.iterator(); //obtendo Iterator para HashSet //obtendo Iterator para LinkedHashSet Iterator itLinkedHashSet = linkedHashSet.iterator();
www.t2ti.com
12
Resultado encontrado:
HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: 0 LinkedHashSet: 0 1 LinkedHashSet: 1 2 LinkedHashSet: 2 3 LinkedHashSet: 3 4 LinkedHashSet: 4 5 LinkedHashSet: 5 6 LinkedHashSet: 6 7 LinkedHashSet: 7 8 LinkedHashSet: 8 9 LinkedHashSet: 9 10 LinkedHashSet: 10 11 LinkedHashSet: 11 12 LinkedHashSet: 12 13 LinkedHashSet: 13 14 LinkedHashSet: 14 15 LinkedHashSet: 15 17 LinkedHashSet: 16 16 LinkedHashSet: 17 19 LinkedHashSet: 18 18 LinkedHashSet: 19
Perceba que at o elemento 15 o HashSet vinha mantendo a ordem de insero durante o processo de iterao dos seus elementos, mas como dito anteriormente, esta situao no garantida e, a partir do elemento seguinte, a ordem foi desrepeitada (linhas em negrito) enquanto isto, no LinkedHashSet, a ordem de insero foi respeitada como era esperado.
TreeSet
um Set ordenado e como tal no aceita duplicatas, ou seja existe alguma regra que garante a ordenao, no Treeset os elementos inseridos sero percorridos de acordo com sua ordem natural e de forma ascendente. Exerccio resolvido Implemente um mtodo que manipule as trs modalidades de Set (HashSet, LinkedHashSet e TreeSet), e insira o mesmo conjunto de inteiros em cada uma delas. Percorra todos os elementos de cada uma delas e compare a ordem
www.t2ti.com
13
public class IntegerLinkedHashSet { public static void main(String[] args) { Set hashSet = new HashSet();//Criacao do HashSet hashSet.add(100);//Adicionando valores aleatoriamente hashSet.add(0); hashSet.add(23); hashSet.add(465); hashSet.add(45); hashSet.add(21); hashSet.add(10); hashSet.add(3); hashSet.add(12); hashSet.add(5); hashSet.add(147); hashSet.add(29); hashSet.add(7); hashSet.add(3); hashSet.add(12); hashSet.add(54); //Criacao do LinkedHashSet a partir do hashSet Set linkedHashSet = new LinkedHashSet(hashSet); Set treeSet = new TreeSet(hashSet);//Criacao do TreeSet a partir do hashSet Iterator itHashSet = hashSet.iterator(); //obtendo Iterator para HashSet //obtendo Iterator para LinkedHashSet Iterator itLinkedHashSet = linkedHashSet.iterator(); Iterator itTreeSet = treeSet.iterator(); //obtendo Iterator para TreeSet //Enquanto existir proximo elemento nos Iterators while(itHashSet.hasNext() && itLinkedHashSet.hasNext() && itTreeSet.hasNext()) { //Imprime (system.out.println) o proximo elemento de cada Iterator System.out.println("HashSet: "+itHashSet.next()+ " LinkedHashSet: "+itLinkedHashSet.next()+ " TreeSet: "+itTreeSet.next()); } } }
Resultado encontrado:
HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: HashSet: 0 LinkedHashSet: 0 TreeSet: 0 100 LinkedHashSet: 100 TreeSet: 3 3 LinkedHashSet: 3 TreeSet: 5 5 LinkedHashSet: 5 TreeSet: 7 7 LinkedHashSet: 7 TreeSet: 10 10 LinkedHashSet: 10 TreeSet: 12 12 LinkedHashSet: 12 TreeSet: 21 465 LinkedHashSet: 465 TreeSet: 23 45 LinkedHashSet: 45 TreeSet: 29 21 LinkedHashSet: 21 TreeSet: 45 54 LinkedHashSet: 54 TreeSet: 54 23 LinkedHashSet: 23 TreeSet: 100 147 LinkedHashSet: 147 TreeSet: 147 29 LinkedHashSet: 29 TreeSet: 465
www.t2ti.com
14
LIST
A interface List garante que todas as suas implementaes sero
organizadas, isto , a ordem de insero ser mantida. Em implementaes da interface List podemos so permitidas duplicatas, isto , objetos iguais de acordo com o mtodo equals(). Ao contrrio do Set, qualquer implementao da interface List mantm seus elementos indexados, ou seja, existe uma preocupao com o posicionamento de cada elemento e esta posio determinada pelo ndice. Devemos utilizar um List quando a ordem de insero ou a posio na coleo nos interessa. Alguns mtodos importantes quando manipulamos Lists:
Mtodo
add( Objeto ) get( ndice ) iterator() size()
Descrio
Adiciona um elemento ao List, na ltima posio Retorna o elemento da posio do ndice Retorna um objeto do tipo Iterator Retorna um int (inteiro) com a quantidade de elementos da coleo
www.t2ti.com
15
ArrayList e Vector:
Um ArrayList pode ser visto como um array (vetor) porm dinmico, isto , ele aumenta o espao disponvel a medida que demandado. Ele organizado pelo ndice, ou seja, temos alguma garantia quanto a ordem que encontraremos os elementos. Vector basicamente um ArrayList, no entanto seus mtodos so sincronizados o que significa que o acesso por vrios processos simultaneamente coordenado. Antes de continuarmos falando das implementaes da interface List, iremos introduzir uma nova caracterstica da linguagem Java e mostrar trechos de cdigos que a utilizam junto com ArrayList e Vector: Generics: uma funcionalidade introduzida a partir da verso 1.5 do Java. Em relao as colees sua principal caracterstica definir o tipo aceito pela coleo; At agora as nossas colees aceitavam qualquer tipo de elemento, desde que fosse um Object, por exemplo, abaixo temos um ArrayList onde adicionamos um String e um Integer:
//Criando ArrayList List arrayList = new ArrayList(); //Adicionando um String arrayList.add(new String("Texto")); //Adicionando um Integer arrayList.add(new Integer(3));
Isto era possvel pois nossas colees aceitam qualquer elemento que seja do tipo Object, e todas as classes criadas em Java automaticamente herdam, e portanto so, da classe Object. No entanto, com o uso de Generics podemos definir de que tipo especfico ser a nossa coleo. Abaixo temos um exemplo de ArrayList, parecido com o anterior, utilizando Generics:
//Criando ArrayList de Integer List<Integer> arrayList = new ArrayList<Integer>(); //Adicionando Integer arrayList.add(new Integer(3));
www.t2ti.com
16
Perceba que a partir de agora este List aceita apenas objetos do tipo Integer utilizando esta notao, declarao <Integer> junto a declarao da Classe/Interface, evito que sejam inseridos indevidamente outros tipos que no sejam Integer na minha coleo.
LinkedList:
Muito similar as duas colees vistas anteriormente (Vector e ArrayList), a diferena que todos os elementos so ligados entre si. O desempenho do LinkedList muito superior aos do ArrayList e Vector quando necessitamos inserir elementos no incio da coleo, no entanto se precisarmos obter algum elemento pelo o ndice o desempenho muito inferior. Exerccio resolvido Implemente um cdigo que compare o tempo de obteno e insero, na primeira posio dos Lists, de 25.000 nmeros inteiros para o ArrayList, Vector e LinkedList.
import import import import java.util.LinkedList; java.util.List; java.util.ArrayList; java.util.Vector;
public class ArrayListVector { public static void main(String[] args) { Integer quantidadeElementos = 25000;//Quantidade total de elementos List<Integer> arrayList = new ArrayList<Integer>();//Criacao do ArrayList de Integer for(int i = 0; i < quantidadeElementos; i++)//Inserir elementos dentro do ArrayList { arrayList.add(i); } //Criacao do LinkedList de Integer, com os mesmos elementos do ArrayList LinkedList<Integer> linkedList = new LinkedList<Integer>(arrayList); //Criacao do Vector de Integer, com os mesmos elementos do ArrayList List<Integer> vector = new Vector<Integer>(arrayList); //inicio da contagem do tempo long inicio = System.currentTimeMillis(); //percorrendo todos os elementos do ArrayList for(int i = 0; i < arrayList.size(); i++) { arrayList.get(i);//Obtendo elementos do ArrayList } //fim da contagem do tempo long fim = System.currentTimeMillis(); System.out.println("Obter elemento. Tempo arrayList: "+(fim-inicio)+" ms"); //inicio da contagem do tempo
www.t2ti.com
17
} }
Resultado obtido:
Obter elemento. Tempo arrayList: 12 ms Obter elemento. Tempo Vector: 12 ms Obter elemento. Tempo linkedList: 1561 ms Inserir elemento no inicio. Tempo arrayList: 1804 ms Inserir elemento no inicio. Tempo Vector: 1809 ms Inserir elemento no inicio. Tempo linkedList: 17 ms
Considerando
que
esta
uma
experincia
apenas
ilustrativa
(no
www.t2ti.com
18
MAP
Um Map, qualquer implementao desta interface, identifica seus elementos atravs de uma chave, logo, esta coleo aceita duplicatas de valores (elementos) desde que eles possuam chaves diferentes. A principal caracterstica dos Maps so suas chaves que nunca podem se repetir, ou seja, em um Map nunca iro haver dois elementos com a mesma chave. Assim como os elementos armazenados as chaves utilizadas nos Maps tambm devem ser objetos. Os principais mtodos utilizados quanto manipulamos Maps so:
Mtodo
put( chave, objeto ) get( chave ) iterator() size() containsKey( chave ) clear() containsValue( objeto )
Descrio
Adiciona a chave e o elemento Retorna o elemento de acordo com a chave Retorna um objeto do tipo Iterator Retorna um int (inteiro) com a quantidade de elementos da coleo Retorna true se a chave j existe Elimina todos os elementos do Set Retorna true se o objeto j existir no Map
HashMap e Hashtable
HashMap um Map desorganizado, isto , a ordem de iterao dos elementos desconhecida, e desordenado, ou seja, os elementos no sofrem nenhum tipo de ordenao derivada de alguma regra. Hashtable, similarmente ao ArrayList e Vector, a verso sincronizada do HashMap. A maior diferena que o HashMap aceita nulos tanto para chaves quanto para valores enquanto o Hashtable no aceita nenhum nulo. A seguir segue trecho de cdigo que exemplifica o uso do HashMap:
//Criacao do HashMap Map notasFiscaisMap = new HashMap(); //Criacao das Notas Fiscais NotaFiscal nf1 = new NotaFiscal(1, Calendar.getInstance().getTime(), 123.56);
www.t2ti.com
19
LinkedHashMap
Muito similar ao LinkedHashSet, porm esta a verso que implementa a interface Map, logo ao armazenar os objetos necessria uma chave. E, ao contrrio do HashMap, o LinkedHashMap organizado, o que significa dizer que durante a iterao dos elementos ele respeita a ordem que estes foram inseridos na coleo. Se a ordem de insero for importante e precisarmos identificar os elementos pelas suas chaves devemos utilizar esta implementao da interface Map. Abaixo temos o mesmo cdigo exibido anteriormente porm a implementao utilizada agora a LinkedHashMap:
//Criacao do LinkedHashMap Map notasFiscaisMap = new LinkedHashMap(); //Criacao das Notas Fiscais NotaFiscal nf1 = new NotaFiscal(1, Calendar.getInstance().getTime(), 123.56); NotaFiscal nf2 = new NotaFiscal(2, Calendar.getInstance().getTime(), 127.00); NotaFiscal nf3 = new NotaFiscal(3, Calendar.getInstance().getTime(), 100.25); //Armazenamento das notas fiscais no notasFiscaisMap.put(nf1.getCodigo(), notasFiscaisMap.put(nf2.getCodigo(), notasFiscaisMap.put(nf3.getCodigo(), HashMap nf1); nf2); nf3);
TreeMap
Assim como o TreeSet um Set que ordena os elementos de acordo com alguma regra, o TreeMap tambm ordena seus elementos atravs da chave por alguma regra. Quando esta ordem no definida pela interface Comparable ou por um objeto Comparator1 o TreeMap busca a ordem natural dos elementos. A seguir apresentado um trecho de cdigo mostrando o uso do TreeMap:
//Criacao do TreeMap utilizando Generics Map<Integer, String> treeMap = new TreeMap<Integer, String>(); //Inserindo os valores treeMap.put(5, "Numero 5"); treeMap.put(1, "Numero 1");
www.t2ti.com
20
Observe que a declarao Map<Integer, String> utiliza generics. Ao declarar um Map desta forma estou garantindo que todas as chaves sero do tipo Integer e todos os valores sero do tipo String.
QUEUE
A ltima das interfaces a ser analisada, a interface Queue projetada para armazenar listas de elementos a serem executados/processados. Os elementos inseridos em uma coleo que implemente esta interface, normalmente, possuir comportamento similar a uma Fila, isto , o primeiro elemento a ser inserido ser o primeiro elemento a ser processado. Os mtodos comumente utilizados com esta coleo so os seguintes:
Mtodo
add( objeto ) offer( objeto ) remove() poll() element() peek()
Descrio
Adiciona o elemento, joga uma exceo se no for possvel incluir Idntico ao add, porm no joga exceo em caso de falha Remove o elemento, joga uma exceo se no houver elementos Idntico ao remove(), porm retorna nulo caso no hajam elementos Retorna elemento elemento inicial, joga exceao caso no haja idntico ao element(), porm retorna nulo caso no haja elemento
PriorityQueue
www.t2ti.com
21
Diferentemente de uma fila convencional, onde o primeiro elemento a ser inserido o primeiro a ser removido, na PriorityQueue nem sempre a ordem de insero representa a ordem de sada dos elementos. Esta ordem administrada pela coleo que priorizar a ordem de sada dos elementos. Esta ordem definida pelo prprio objeto quando este implementa a interface Comparable, por um objeto Comparator ou pela ordem natural dos elementos. A seguir mostraremos trecho de cdigo que exemplifica o uso da PriorityQueue:
//Criando a minha Queue utilizando Generics Queue<Integer> filaPrioridade = new PriorityQueue<Integer>(); //Adicionando elementos filaPrioridade.add(5); filaPrioridade.add(5); filaPrioridade.add(2); filaPrioridade.add(3); filaPrioridade.add(0); filaPrioridade.add(-2); //Removendo elementos e imprimindo System.out.println("poll: "+filaPrioridade.poll()); System.out.println("poll: "+filaPrioridade.poll()); System.out.println("poll: "+filaPrioridade.poll()); System.out.println("poll: "+filaPrioridade.poll()); System.out.println("poll: "+filaPrioridade.poll()); System.out.println("poll: "+filaPrioridade.poll()); System.out.println("poll: "+filaPrioridade.poll());
Resultado obtido:
poll: poll: poll: poll: poll: poll: poll: -2 0 2 3 5 5 null
No exemplo apresentado, a ordem de prioridade foi definida naturalmente uma vez que tratavam-se de nmeros inteiros. A ordem natural , neste caso, do menor para o maior. Ao fim da execuo o resultado null significa que no existem mais elementos na fila pois todos j foram removidos.
A classe Collections
www.t2ti.com
22
Da mesma forma que para arrays (vetores), Java fornece uma classe com um conjunto de funcionalidades muito utilizadas (ordenao, pesquisa, preenchimento e etc.) na manipulao das estruturas de dados do Framework Collections tambm existe uma classe similar (Collections) A classe Collections (mesmo nome do framework) para as colees do framework a mesma coisa que a classe Arrays para os vetores (arrays) convencionais, portanto, quando voc precisar destes tipos de funcionalidades, ir apenas adaptar s suas necessidades, se for necessrio. A seguir iremos explorar brevemente as principais funcionalidades.
Ordenao
O algoritmo de ordenao implementado na classe Collections ordena os elementos em ordem ascendente. Temos um exemplo de cdigo a seguir:
//Criao do ArrayList List arrayList = new ArrayList(); //Adicionando elementos arrayList.add("Miguel"); arrayList.add("Albert"); arrayList.add("Fernando"); arrayList.add("Mario"); //Ordenando Collections.sort(arrayList); //Imprimindo o resultado System.out.println(arrayList);
Resultado obtido:
[Albert, Fernando, Mario, Miguel]
Mistura/Desordenao
Este algoritmo o oposto ao anterior, ao invs de ordenar ele desordena (mistura) os elementos dentro de um List. A primeira vista pode parecer pouco til, mas existem situaes onde voc ir querer desordenar sua estrutura de dados para obter um elemento aleatoriamente. Por exemplo, abaixo temos uma possvel implementao para a modalidade de sorteio cujos nomes dos elementos a serem sorteados, normalmente pessoas, so escritos em pequenos pedaos de papis e o primeiro a ser escolhido o vencedor.
www.t2ti.com
23
//Criao do ArrayList List arrayList = new ArrayList(); //Adicionando elementos arrayList.add("Miguel"); arrayList.add("Albert"); arrayList.add("Fernando"); arrayList.add("Mario"); //Misturando elementos Collections.shuffle(arrayList); //Sorteando o primeiro nome e imprimindo o resultado System.out.println(arrayList.get(0));
Perceba que o elemento na posio 0 (zero), pela ordem de insero seria Miguel e, no entanto, obtivemos o elemento Fernando, o que confirma, a mudana de posio destes elementos dentro do List.
Pesquisa:
Quando falamos em estruturas de dados obrigatoriamente devemos pensar em algoritmos de ordenao e pesquisa, pois, de que adianta uma estrutura de dados cujos elementos no conseguimos localizar? Ao manipularmos estruturas de dados sempre devemos ter em mente que iremos orden-las ou pesquis-las. Por isto a importncia deste algoritmo. A pesquisa efetuada pela Classe Collections retorna um nmero inteiro positivo ou zero se o elemento for encontrado e negativo se o elemento no existe na coleo. Quando o elemento existe na coleo o nmero representa o seu ndice (posio), por outro lado, quando o elemento no existe, o nmero, em mdulo, representa a posio que ele deveria estar (ponto de insero), neste caso, esta posio somente vlida se a coleo estiver ordenada antes da pesquisa. A seguir temos um exemplo:
//Criao do ArrayList List arrayList = new ArrayList(); //Adicionando elementos arrayList.add("Miguel"); arrayList.add("Albert"); arrayList.add("Fernando"); arrayList.add("Mario"); //Pesquisando int resultado = Collections.binarySearch(arrayList, "Albert"); //Imprimindo resultado
www.t2ti.com
24
Resultado da execuo:
Resultado da pesquisa: 1
O resultado obtido, conforme esperado, indica que o nome Albert encontra-se na segunda posio da coleo, lembrando que todas as colees iniciamse pelo ndice 0 (zero), logo, o valor 1 indica a segunda posio.
EXERCCIOS
Aprenda com quem tambm est aprendendo, veja e compartilhe as suas respostas no nosso Frum: Exerccios Mdulo 09 Colees Framework Collections 1. Implemente cdigo que possua um ArrayList e insira 200 Strings nesta lista. 2. Faa um ArrayList e insira as Strings String 1, String 2 e String 3 cada uma duas vezes, percorra todos os elementos e imprima (System.out.println()). Observe o resultado. Quantos elementos tm a coleo? 3. Faa um HashSet e insira as Strings String 1, String 2 e String 3 cada uma duas vezes, percorra todos os elementos e imprima (System.out.println()).
www.t2ti.com
25
www.t2ti.com
26
www.t2ti.com
27