NT8 - Artigo Collections

download NT8 - Artigo Collections

of 10

Transcript of NT8 - Artigo Collections

  • 7/25/2019 NT8 - Artigo Collections

    1/10

    Caelumhttp://www.caelum.com.br

    Collections Framework

    A amizade um contrato segundo o qual nos comprometemos a prestarpequenos favores para que no-los retribuam com grandes. Baron de la

    Brede et de MontesquieuAo trmino desse captulo voc ser capaz de:

    deixar de lado as arrays do Java quando performance for mais importante quememria;

    utilizar arrays ou sets dependendo da necessidade do programa;

    iterar e ordenar listas e colees e

    usar mapas para insero e busca de objetos.

    Arrays

    A utilizao de arrays complicada em muitos pontos:- no podemos redimensionar uma array em Java

    - impossvel buscar diretamente por um determinado elemento para o qual no se sabe o ndice

    - no conseguimos saber quantas posies da array j foram populadas sem criar, para isso, mtodosauxiliares.

    Na figura ao lado voc pode ver umarray que antes estava sendocompletamente utilizado, e que depois teve

    um de seus elementos removidos.

    Venda: carro vermelho

    carro[3] = null;

    Supondo que os dados armazenados representem carros, o que acontece quando precisarmos inserirum novo carro no estoque?

    Precisaremos procurar por um espao vazio?

    Iremos guardar em alguma estrutura de dados externa as posies vazias?

    E se no houver espao vazio? Teramos de criar um array maior e copiar os dados do antigo para ele?

    H mais questes: como sei quantas posies esto sendo usadas no array? Vou precisar semprepercorrer o array inteiro para conseguir essa informao?

    Alm dessas dificuldades que as arrays apresentavam, faltava um conjunto robusto de classes parasuprir a necessidade de estruturas de dados bsicas, como listas ligadas e tabelas de espalhamento.

    Com esses e outros objetivos em mente a Sun criou um conjunto de classes e interfaces conhecidocomo CollectionsFrameworkque reside no pacotejava.util.

    Collections

    AAPI do Collections robusta e possui diversas classes que representam estruturasde dados avanadas.

    Por exemplo, no necessrio reinventar a roda e criar uma lista ligada mas simutilizar aquela que a Sun disponibilizou.

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.1

  • 7/25/2019 NT8 - Artigo Collections

    2/10

    Caelumhttp://www.caelum.com.br

    Principais interfaces

    As colees tm como base a interface Collection, que define mtodos para adicionar e remover umelemento, verificar se ele est na coleo entre outras operaes, como mostra a tabela a seguir:

    boolean add(Object) Adiciona um elemento na coleo. Como algumas colees no suportamelementos duplicados, este mtodo retorna true ou false indicando se aadio foi efetuada com sucesso.

    boolean remove(Object) Remove determinado elemento da coleo. Se ele no existia, retornafalse.

    int size() Retorna a quantidade de elementos existentes na coleo.boolean contains(Object) Procura por determinado elemento na coleo, e retorna verdadeiro caso

    ele exista. Esta comparao feita baseando-se no mtodo equals() doobjeto, e no atravs do operador ==.

    Iteratoriterator() Retorna um objeto que possibilita percorrer os elementos daquela

    coleo.

    Uma coleo pode implementar diretamente ainterface Collection, porm existem duassubinterfaces que so amplamente utilizadas: SeteList.

    A interface Set define um conjunto de elementosnicos enquanto a interface List permite a rplicade elementos.

    A busca em um Set mais rpida que em umobjeto do tipo List porm a insero mais lenta aocomparar os algoritmos dos dois objetos.

    A interface Mapfaz parte do framework mas noestende Collection.

    Veremos detalhes sobre cada uma dessasinterfaces e suas principais implementaes a seguir.

    Classe de exemplo

    Para este captulo iremos utilizar a classe a seguir:

    public class Pai s {

    / / o nome do pai spublic Str i ng nome;

    / / t amanho do t err eno do pai spublic doubl e kmQuadrados;

    }

    Lista

    Uma lista uma coleo que permite elementos duplicados e mantendo uma ordenao especfica

    entre os elementos.

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.2

  • 7/25/2019 NT8 - Artigo Collections

    3/10

    Caelumhttp://www.caelum.com.br

    Em outras palavras, voc tem a garantia de que, quando percorrer a lista, os elementos seroencontrados em uma ordem pr-determinada, definida na hora da insero dos mesmos.

    A implementao mais famosa da interface List aArrayList que trabalha com uma array interna paragerar uma lista portanto ela mais rpida na pesquisa que sua concorrente, a LinkedList, que maisrpida na insero e remoo de itens nas pontas.

    Para criar umArrayListbasta chamaro construtor:

    Arr ayLi st l i s ta = new Arr ayLi st( ) ;

    sempre possvel abstrair a lista apartir da interface List:

    Li st mesmaLi sta = l i sta;

    A interface Listpossui dois mtodos

    add, um que recebe o objeto a serinserido e o coloca no final da lista e umsegundo que permite adicionar oelemento em qualquer posio damesma.

    A interface List e algumas classesque a implementam podem ser vistasno diagrama UML ao lado.

    O exemplo a seguir gera trs pases e insere eles no fim de uma lista. Importante: os quilmetrosquadrados so meramente ilustrativos!

    O grfico da direita mostra a lista aps incluir os trs pases Brasil, Japo e Eua.

    public class Test aArr ayLi st {Lista Os pases

    public static void mai n( St r i ng ar gs[ ] ) {

    Pai s bras i l = new Pai s ( ) ;B J Ebrasi l . nome = Bras i l ;

    brasi l . kmQuadrados = 1000;

    Pai s j apao = new Pai s ( ) ; - O pas Brasil est na lista?j apao. nome = J apao; if(lista.contains(brasil)) {j apao. kmQuadrados = 500; // sim!

    }Pai s eua = new Pai s ( ) ;eua. nome = EUA; - Remova o pas Japo:eua. kmQuadr ados = 100; lista.remove(japao);

    Arr ayLi st l i s ta = new Arr ayLi st( ) ; - Remova o segundo pas.l i s t a. add(bras i l ) ; lista.remove(1);l i s ta. add( j apao);l i s ta. add(eua) ; - Limpe a lista.

    lista.clear(); Syst em. out . pr i nt l n( "Tamanho : " +

    l i st a. si ze( ) ) ;

    }

    }

    O mtodoget(int)

    retorna o elemento na posio especificada como parmetro, iniciando na posio

    zero, assim como trabalhando com uma array comum. Atravs dele e do mtodo size fica fcil percorrerumaArrayList.

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.3

  • 7/25/2019 NT8 - Artigo Collections

    4/10

    Caelumhttp://www.caelum.com.br

    Vale lembrar que o exemplo a seguir mostra que, em uma lista, a ordem dos elementos no alterada:

    public class Mostr aAr r ayLi st {

    public static void mai n( St r i ng args[ ] ) {

    Pai s brasi l = new Pai s ( ) ;brasi l . nome = "Brasi l " ;brasi l . kmQuadrados = 1000;

    Pai s j apao = new Pai s ( ) ;j apao. nome = J apao;j apao. kmQuadrados = 500;

    Pai s eua = new Pai s ( ) ;eua. nome = EUA;eua. kmQuadr ados = 500;

    Arr ayLi st l i s ta = new Arr ayLi st( ) ;l i s t a. add(bras i l ) ;l i s ta.add( j apao);

    l i s ta.add( eua);

    / / passa por cada i t em, at l i sta. si ze( )fo r ( int i = 0; i ! = l i s t a. si ze( ) ; i ++) {

    / / f az o castPai s pai sAtual = (Pai s ) l i s t a. get ( i ) ;

    / / i mpr i me o val orSyst em. out . pr i nt l n( pai sAt ual . nome);

    }

    }

    }

    importante lembrar que uma coleo sempre trabalha com Objectportanto existe a necessidade defazer o cast na referncia, passando de Object para a classe apropriada antes de utilizar o elementoobtido da coleo.

    Acesso aleatrio

    Algumas listas, como aArrayList , tem acesso aleatrio aos seus elementos: a busca porum elemento em uma determinada posio feita de maneira imediata, sem que a listainteira seja percorrida.

    Neste caso o acesso feito atravs do mtodo get(int) e muito rpido.

    Uma lista uma excelente alternativa a um array comum j que temos todos os benefcios de arrays,sem a necessidade de tomar cuidado com remoes, falta de espao etc.

    A outra implementao muito usada (LinkedList), fornece mtodos adicionais para obter e remover oprimeiro e ltimo elemento da lista.

    Vector

    Outra implementao a tradicional classe Vector, presente desde o Java 1.0, que foiadaptada para uso com o framework de collections, com a incluso de novos mtodos.

    Ela deve ser tratada com cuidado pois lida de uma maneira diferente com processos

    correndo em paralelo e ser mais lento que umaArrayList quando no houver acessosimultneo aos dados.

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.4

  • 7/25/2019 NT8 - Artigo Collections

    5/10

    Caelumhttp://www.caelum.com.br

    Mapas

    Um mapa composto de uma associao de um objeto chave a um objeto valor.

    Ele um mapa pois possvel us-lo para mapear uma chave, por exemplo: mapeie o valor EstadosUnidos chave norte, ou mapeie Oceano chave sul.

    chaves valores

    Possveis aes em ummapa:

    Mapeie uma ilha ao Norte.O que est mapeado no Sul?Remapeie oceano ao Norte.Quero o conjunto de chaves.Quero o conjunto de valores.O que est mapeado aoLeste?

    Desmapeie o Leste.

    Algumas linguagens, como Perl, PHP, possuem suporte nativo a mapas,onde so conhecidos como matrizes associativas.

    O mtodo put(Object, Object) da interfaceMaprecebe a chave e o valorde uma nova associao. Para saber o que est associado a um determinadoobjeto-chave, passa-se esse objeto no mtodo get(Object). Observe oexemplo:

    Str i ng gui ana = Gui ana Francesa;St r i ng ur uguai = Ur uguai ;

    / / cr i a o mapaMap mapa = new HashMap( ) ;

    / / adi ci ona al go ao nort e e al go ao sulmapa. put ( nor t e, gui ana);mapa. put ( sul , ur uguai ) ;

    / / que pai s esta associ ado a St r i ng sul ?Obj ect el ement o = mapa. get( sul ) ;St ri ng pai s = ( St ri ng) el ement o;

    Um mapa, assim como as colees, trabalha diretamente com Objects, o que torna necessrio ocasting no momento que recuperar elementos. Suas principais implementaes so o HashMap e oHashtable.

    Apesar do mapa fazer parte do framework, ele no implementa a interface Collection, por ter umcomportamento bem diferente. Porm, as colees internas de um mapa (a de chaves e a de valores, verFigura 7) so acessveis por mtodos definidos na interface Map.

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.5

  • 7/25/2019 NT8 - Artigo Collections

    6/10

    Caelumhttp://www.caelum.com.br

    Ensino e Solues em Java (11) 55712751www.caelum.com.br

    Caelum- Java e Orientao a Objetos Pgina 14.6

    O mtodo keySet() retorna um Set com as chaves daquele mapa, e o mtodo values() retorna aCollection com todos os valores que foram associados a alguma das chaves.

    Um mapa importante a tradicional classe Properties, que mapeia strings e muito utilizada para aconfigurao de aplicaes.

    Proper t i es conf i g = new Propert i es() ;

    conf i g. set Pr opert y( dat abase. l ogi n, scot t ) ;conf i g. set Proper t y(dat abase. passwor d, t i ger ) ;conf i g. set Pr opert y( dat abase. url , j dbc: mysql : / l ocal host/ t este);

    / / mui t as l i nhas depoi sSt ri ng l ogi n = conf i g. get Propert y(dat abase. l ogi n) ;Str i ng password = conf i g. getPr opert y( database. password) ;Str i ng ur l = conf i g. getPropert y(dat abase. ur l ) ;Dr i ver Manager. getConnecti on( ur l , l ogi n, password) ;

    Repare que no houve a necessidade do casting para String no momento de recuperar os objetosassociados. Isto porque a classe Properties foi desenhada com o propsito de trabalhar com a associaoentre Strings.

    A Properties possui tambm mtodos para ler e gravar o mapeamento com base em um arquivotexto, facilitando muito a sua persistncia.

    Conjunto

    Um conjunto (Set) funciona deforma anloga aos conjuntos damatemtica, ele uma coleo queno permite elementos duplicados.

    Outra caracterstica fundamentaldele o fato de que a ordem em queos elementos so armazenados podeno ser a ordem na qual eles foraminseridos no conjunto.

    Tal ordem varia de implementaopara implementao.

    Um conjunto representado pela interface Sete tem como suas principais implementaes as classesHashSete TreeSet.

    O cdigo a seguir cria um conjunto e adiciona trs itens, apesarde tentar adicionar quatro:

    Set conj unt o = new HashSet ( ) ;conj unt o. add( i t em 1) ;conj unt o. add( i t em 2) ;conj unt o. add( i t em 3) ;conj unt o. add( i t em 3) ;

    / / i mpri me a sequnci a na t el aSystem. out . pri nt l n( conj unt o) ;

    Possveis aes em um conjunto:

    - A camiseta Azul est no conjunto?- Remova a camiseta Azul.

    - Adicione a camiseta Vermelha.

    - Limpe o conjunto.

    - No existem elementosduplicados!

    - Ao percorrer um conjunto, sua

  • 7/25/2019 NT8 - Artigo Collections

    7/10

    Caelumhttp://www.caelum.com.br

    O resultado so os elementos do conjunto, a ordem na qual eles aparecem podem ou no ser a ordemna qual eles foram inseridos e incorreto supor que ser sempre a mesma ordem!

    Ordenando um set

    Seria possvel usar uma outra implementao de conjuntos, como um TreeSet, que

    insere os elementos, de tal forma, que quando forem percorridos, aparecem em umaordem definida pelo mtodo de comparao entre seus elementos. Esse mtodo

    definido pela interfacejava.lang.Comparable.

    Iterando sobre colees

    Como percorrer os elementos de uma coleo? Se for uma lista, podemos sempre utilizar um lao for,chamando o mtodo getpara cada elemento. Mas e se a coleo no permitir indexao?

    Por exemplo, um Set no possui uma funo para pegar o primeiro, o segundo ou o quinto elementodo conjunto...

    Toda coleo fornece acessoa um iterator, um objeto queimplementa a interfaceIterator, que conheceinternamente a coleo e dacesso a todos os seuselementos, como a figura aolado mostra.

    Possveis aes em um iterador:

    - Existe um prximo elemento nacoleo?.- Pegue o prximo elemento.- Remova o elemento atual dacole o.

    Camiseta c =(Camiseta) iterator.next();

    Primeiro criamos umIterator que entra na coleo.

    A cada chamada do mtodo

    next, o Iterator retorna oprximo objeto do conjunto.

    Um iterator pode ser obtido com o mtodo iterator() de Collection, por exemplo:

    I t er at or i = l i st a. i t er at or ( ) ;

    A interface Iteratorpossui dois mtodos principais: hasNext()(com retorno booleano) indica se aindaexiste um elemento a ser percorrido; next()retorna o prximo objeto.

    Voltando ao exemplo do conjunto de strings, vamos percorrer o conjunto:

    / / popul a o conj unt oSet conj unt o = new HashSet( ) ;conj unt o. add( i t em 1) ;conj unt o. add( i t em 2) ;conj unt o. add( i t em 3) ;

    / / retorna o i teratorI t erator i = conj unto. i t erator ( ) ;while ( i . hasNext ( ) ) {

    / / r ecebe a pal avr aObj ect el ement o = i . next ( ) ;St r i ng pal avr a = ( St r i ng) el ement o;

    / / most r a el aSystem. out . pr i nt l n( pal avra) ;

    }

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.7

  • 7/25/2019 NT8 - Artigo Collections

    8/10

    Caelumhttp://www.caelum.com.br

    O whileanterior s termina quando todos os elementos do conjunto forem percorridos, isto , quandoo mtodo hasNext mencionar que no existem mais itens.

    Em que ordem sero acessados os elementos?

    Numa lista, os elementos iro aparecer de acordo com o ndice em que foram inseridos, isto , de

    acordo com o que foi pr-determinado. Em um conjunto, a ordem depende da implementao dainterface Set.

    Por que o Set ento to importante e usado?

    Para perceber se um item j existe em uma lista muito mais rpido usar um Set do que um List, eos TreeSetsj vem ordenados de acordo com as caractersticas que desejarmos!

    ListIterator

    Uma lista fornece, alm de acesso a um Iterator, um ListIterator, que oferece recursosadicionais, especficos para listas.

    Usando o ListIterator voc pode, por exemplo, adicionar um elemento na lista ouvoltar para o elemento que foi "iterado" anteriormente.

    Ordenao

    Muitas vezes queremos percorrer a nossa coleo de maneira ordenada. Mas como definir a ordem dosobjetos?

    Vimos anteriormente que as listas so percorridas de maneira pr-determinada de acordo com aincluso dos itens e que os conjuntos so percorridos de forma (at agora) indeterminada.

    necessrio capacitar nosso programa na comparao de dois objetos da coleo. Para isso existemduas maneiras:

    Uma fazer com que os elementos da sua coleo implementem a interface java.lang.Comparable,que define o mtodo in tcompareTo(Object). Este mtodo deve retornar zero se o objeto comparado forigual a este objeto, um nmero negativo se este objeto for menor que o objeto dado, e um nmeropositivo se este objeto for maior que o objeto dado.

    Para ordenar os carros por velocidadeMaxima, basta implementar o Comparable:

    public class Carr o implements Comparabl e {

    / / . . . t odo o codi go ant er i or f i ca aqui

    public int compar eTo(Obj ect obj ect ) {

    Car ro out ro = ( Carr o) obj ect;

    if( this. vel oci dadeMaxi ma < out r a. vel oci dadeMaxi ma) {return - 1 ;

    }

    if( this. vel oci dadeMaxi ma > out r a. vel oci dadeMaxi ma) {return 1;

    }

    return 0;

    }

    }

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.8

  • 7/25/2019 NT8 - Artigo Collections

    9/10

    Caelumhttp://www.caelum.com.br

    Com o cdigo anterior, nossa classe tornou-se comparvel: dados dois objetos da classe,conseguimos dizer se um objeto maior, menor ou igual ao outro, segundo algum critrio por nsdefinido. No nosso caso, a comparao ser feita baseando-se na velocidade mxima do carro.

    Como fazemos para ordenar a coleo? Podemos usar os mtodos da classe utilitria Collections, queinclui uma srie de mtodos estticos que realizam funes comuns em colees. Voc pode ordenar uma

    lista, obter o maior elemento de uma coleo, entre muitas outras funcionalidades, j que seuselementos agora so comparveis. A tabela a seguir mostra alguns dos mtodos da Collections.

    int binarySearch (List, Object) Realiza uma busca binria por determinadoelemento na lista ordenada, e retorna sua posio,ou um nmero negativo caso no encontrado.

    Objectmax(Collection) Retorna o maior elemento da coleo.

    Objectmin(Collection) Retorna o menor elemento da coleo.

    void sort(List) Ordena a lista dada em ordem ascendente.

    Muitos mtodos exigem que os objetos sejam comparveis. O seguinte exemplo mostra como simples ordenar uma lista:

    Li st carr os = new Ar r ayLi s t ( ) ;

    / / adi ci ona o pr i mei r o car r oCarr o c1 = new Carr o() ;c2. set Vel oci dadeMaxi ma(200);carr os. add( c1) ;

    / / adi ci ona o segundo car r oCarr o c2 = new Carr o() ;c2. set Vel oci dadeMaxi ma(100);carr os. add( c2) ;

    / / ordenaCol l ect i ons. sort ( carr os) ;

    Outro jeito de ordenar, que ordena a cada insero, utilizando o TreeSet. Ao final do cdigo a seguir,os carros j estaro ordenados!

    Col l ecti on car ros = new TreeSet ( ) ;

    / / adi ci ona o pr i mei r o car r oCarr o c1 = new Carr o() ;c2. set Vel oci dadeMaxi ma(200);carr os. add( c1) ;

    / / adi ci ona o segundo car r oCarr o c2 = new Carr o() ;c2. set Vel oci dadeMaxi ma(100);carr os. add( c2) ;

    Opcionalmente, em vez de implementar Comparable, voc pode fornecer um java.util .Comparatorcomo argumento a alguns dos mtodos da Collections. Por exemplo, temos tambm o mtodo sort(List,Comparator), que muito utilizado se voc no tem acesso ao cdigo fonte da classe dos seuselementos, ou se for necessrio ordenar uma lista de vrias maneiras diferentes.

    Jakarta Commons Collections

    O projeto Jakarta possui uma srie de APIs menores, conhecidas como jakarta-commons. Dentre elas, existe algumas classes de colees diferentes das encontradasnojava.util , assim como algumas classes auxiliares.

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.9

  • 7/25/2019 NT8 - Artigo Collections

    10/10

    Caelumhttp://www.caelum.com.br

    As colees do jakarta incluem a interessante interface Predicate, onde voc podedefinir uma query para executar sobre uma coleo, trazendo um Iterator que iteraapenas sobre os objetos que obedecem ao predicado dado.

    Por exemplo, com uma coleo de carros, necessrio um iterator apenas para os

    carros verdes.

    Entre outras, as Jakarta Collections possuem colees para tipos primitivos,eliminando a necessidade de utilizar as classes wrapper do Java. Tambm existe umheap binrio, no qual a coleo est ordenada de tal maneira que possvel obter o

    valor mximo (ou mnimo) rapidamente, em tempo constante (ou O(1)).

    Boas prticas

    As colees do Java oferecem grande flexibilidade ao usurio. A perda de performanceem relao a utilizao de arrays irrelevante, mas deve-se tomar algumas precaues:

    - Grande parte das colees usam internamente uma array para armazenar os seusdados. Quando essa array no mais suficiente, criada uma maior e o contedo daantiga copiado. Este processo pode acontecer muitas vezes no caso de voc ter umacoleo que cresce muito. Voc deve ento criar uma coleo j com uma capacidadegrande, para evitar o excesso de redimensionamento.

    - Evite usar colees que guardam os elementos pela sua ordem de comparao

    quando no h necessidade. Um TreeSet gasta computacionalmente O(log(n)) parainserir (ele utiliza uma rvore rubro-negra como implementao), enquanto o HashSetgasta apenas O(1).

    - No itere sobre uma List utilizando um for de 0 at list.size(), e usando get(int) para

    receber os objetos. Enquanto isso parece atraente, algumas implementaes da Listno so de acesso aleatrio como a LinkedList, fazendo esse cdigo ter uma pssimaperformance computacional.

    Exerccios

    1-) Crie no projeto de trens uma classe Carga, guarde diversas Cargas dentro de um trem atravs deumaArrayList.

    2-) Crie um campo cdigopara cada trem e mapeie os trens por cdigo em um HashMap. Utilize essemesmo HashMap para recuperar cada um desses trens.

    3-) Altere a forma de comparao de dois carros atravs da velocidade atual. Veja o que acontece aoalterar a velocidade de um carro que j est no TreeSet.

    Desafios

    1-) Gere todos os nmeros entre 1 e 1000 e ordene em ordem no crescente utilizando um TreeSet.

    2-) Gere todos os nmeros entre 1 e 1000 e ordene em ordem no crescente utilizando umArrayList .

    Caelum Ensino e Solues em Java (11) 55712751www.caelum.com.br- Java e Orientao a Objetos Pgina 14.10