Listas (parte 2 de 3)
Upcoming SlideShare
Loading in...5
×
 

Listas (parte 2 de 3)

on

  • 795 views

 

Statistics

Views

Total Views
795
Views on SlideShare
422
Embed Views
373

Actions

Likes
0
Downloads
11
Comments
0

5 Embeds 373

http://aulasdosidney.blogspot.com.br 271
http://aulasdosidney.blogspot.ru 65
http://www.aulasdosidney.blogspot.com.br 33
http://aulasdosidney.blogspot.com 3
http://webcache.googleusercontent.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Listas (parte 2 de 3) Listas (parte 2 de 3) Presentation Transcript

  • Tecnologia em Sistemas para Internet - IFMSAula 05 – Listas (parte 2)Estruturas de DadosProf.º Msc. Sidney Roberto de Sousasidney.sousa@ifms.edu.br
  • Tec. em Sistemas para Internet - IFMS 2O que veremos nesta aula?●Criando uma lista encadeada genérica●A interface List do pacote java.util●Formas de instanciação da interface List
  • Tec. em Sistemas para Internet - IFMS 3Recapitulando...●Na aula anterior, vimos uma classe queencapsula uma lista encadeada de valoresinteiros●Ou seja, uma instância daquela classe podearmazenar um conjunto teoricamente infinitode valores inteiros
  • Tec. em Sistemas para Internet - IFMS 4Problema●Digamos que desejamos criar uma listaencadeada para armazenar strings●O que devemos fazer? talvez possamos→re-escrever a classe ListaEncadeada de talforma que ela possa armazenar strings aoinvés de valores inteiros●Problema resolvido!
  • Tec. em Sistemas para Internet - IFMS 5Problema●Digamos que desejamos criar uma listaencadeada para armazenar strings●O que devemos fazer? → talvez possamosre-escrever a classe ListaEncadeada de talforma que ela possa armazenar strings aoinvés de valores inteiros●Problema resolvido!?
  • Tec. em Sistemas para Internet - IFMS 6Problema●Agora, digamos que estamos implementandoum sistema complexo, no qual precisaremosutilizar listas de tipos variados →possivelmente até tipos complexos●Ex.: lista de usuários, lista de clientes, lista depedidos, etc.●Solução: escrever uma cópia da classeListaEncadeada para cada tipo desejado!
  • Tec. em Sistemas para Internet - IFMS 7Vamos realmente fazer isto?
  • Tec. em Sistemas para Internet - IFMS 8Como resolver este problema?●Realmente, criar uma classe para cada tipo dedados pode ser extremamente inviável!●A questão é: como escrever o código da classeListaEncadeada somente uma vez, porémpermitindo que o tipo do item a serarmazenado possa ser definido apenas nomomento em que a lista for criada?●Ou seja, precisamos escrever uma classegenérica!
  • Tec. em Sistemas para Internet - IFMS 9Generics●Generics ou programação genérica em Java éuma forma de determinar ao compilador qualo tipo que deve ser interpretado em umdeterminado trecho do programa●Isto facilita muito o reúso de software no→nosso caso, escrever a classe ListaEncadeadasomente uma vez!
  • Tec. em Sistemas para Internet - IFMS 10Classes NoGenerico e ListaEncadeadaGenerica(abaixo no blog)
  • Tec. em Sistemas para Internet - IFMS 11A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}
  • Tec. em Sistemas para Internet - IFMS 12A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}A classe NoGenericoimplementa um nó de uma listagenérica. Assim, cada instânciada classe NoGenerico podearmazenar um valor do tipodesejado.
  • Tec. em Sistemas para Internet - IFMS 13A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}A letra T identifica um tipo genérico. Assim, aclasse NoGenerico pode utilizar o tipo genéricoT em seus atributos e métodos para especificaro uso de um tipo que será definidoposteriormente pelo trecho de código queutilizá-la. Você pode batizar o seu tipo genéricoconforme o seu gosto. Por convenção, tiposgenéricos são batizados com apenas uma letramaiúscula.
  • Tec. em Sistemas para Internet - IFMS 14A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}Uma classe pode ter tantos tipos genéricosforem necessários à sua implementação.Obrigatoriamente, o trecho de código queutilizar a classe que contém os tipos genéricosdeve definir qual será o tipo utilizado para cadatipo genérico.
  • Tec. em Sistemas para Internet - IFMS 15A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}O valor do item a serarmazenado é definido com otipo genérico.
  • Tec. em Sistemas para Internet - IFMS 16A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}O próximo item após o item atual. Note que noinstante da declaração do objeto é necessáriodefinir qual será o tipo a ser utilizado. Como aindanão sabemos qual o tipo definitivo a ser utilizado,associamos o tipo T ao tipo do valor do próximoitem.
  • Tec. em Sistemas para Internet - IFMS 17A classe NoGenericopublic class NoGenerico<T> {    private T item;    private NoGenerico<T> proximoItem;    public NoGenerico() {        proximoItem = null;    }    // Getters e setters para os atributos da classe...}O tipo genérico não precisa serespecificado no construtor daclasse.
  • Tec. em Sistemas para Internet - IFMS 18A classe ListaEncadeadaGenerica●Os métodos e atributos da classeListaEncadeadaGenerica são parecidos comos da classe ListaEncadeada●Porém, o tipo genérico é utilizado sempre queo tipo dos ítens armazenados precisa serreferenciado
  • Tec. em Sistemas para Internet - IFMS 19A classe ListaEncadeadaGenericapublic class ListaEncadeadaGenerica<T> {    private int tamanho;    private NoGenerico<T> primeiroItem;    private NoGenerico<T> ultimoItem;    public ListaEncadeadaGenerica() {        primeiroItem = null;        ultimoItem = null;        tamanho = 0;    }    // Restante da classe...}
  • Tec. em Sistemas para Internet - IFMS 20A classe ListaEncadeadaGenericapublic class ListaEncadeadaGenerica<T> {    private int tamanho;    private NoGenerico<T> primeiroItem;    private NoGenerico<T> ultimoItem;    public ListaEncadeadaGenerica() {        primeiroItem = null;        ultimoItem = null;        tamanho = 0;    }    // Restante da classe...}A classe ListaEncadeadaGenerica utilizao tipo genérico T para definir qual o tipo dovalor a ser armazenado em cada item. Otipo genérico é propagado a cada item dalista no momento de sua instanciação.
  • Tec. em Sistemas para Internet - IFMS 21A classe ListaEncadeadaGenericapublic class ListaEncadeadaGenerica<T> {    private int tamanho;    private NoGenerico<T> primeiroItem;    private NoGenerico<T> ultimoItem;    public ListaEncadeadaGenerica() {        primeiroItem = null;        ultimoItem = null;        tamanho = 0;    }    // Restante da classe...}O primeiro e último ítens da lista são criados como tipo genérico. Assim, quando a lista for criada,estes ítens estarão preparados para armazenaros valores desejados de forma apropriada.
  • Tec. em Sistemas para Internet - IFMS 22Utilizando o tipo genérico nas operações da listapublic void adicionarNoInicio(T novoItem) {    if (tamanho == 0) {        primeiroItem = new NoGenerico<T>();        primeiroItem.setItem(novoItem);        ultimoItem = primeiroItem;    } else {        NoGenerico<T> antigoPrimeiroItem = primeiroItem;        primeiroItem = new NoGenerico<T>();        primeiroItem.setItem(novoItem);        primeiroItem.setProximoItem(antigoPrimeiroItem);    }    tamanho++;}
  • Tec. em Sistemas para Internet - IFMS 23Utilizando o tipo genérico nas operações da listapublic void adicionarNoInicio(T novoItem) {    if (tamanho == 0) {        primeiroItem = new NoGenerico<T>();        primeiroItem.setItem(novoItem);        ultimoItem = primeiroItem;    } else {        NoGenerico<T> antigoPrimeiroItem = primeiroItem;        primeiroItem = new NoGenerico<T>();        primeiroItem.setItem(novoItem);        primeiroItem.setProximoItem(antigoPrimeiroItem);    }    tamanho++;}
  • Tec. em Sistemas para Internet - IFMS 24Utilizando a lista encadeada genéricaListaEncadeadaGenerica<String> listaEncadeada = new ListaEncadeadaGenerica<String>();listaEncadeada.adicionarNoInicio("ao");listaEncadeada.adicionarNoInicio("foi");listaEncadeada.adicionarNoInicio("João");listaEncadeada.adicionarNoFinal("bar");listaEncadeada.adicionarNaPosicao("Paulo", 2);NoGenerico<String> item = listaEncadeada.pegarItem(1);// Imprime na tela:// João Paulo foi ao barwhile (item != null) {    System.out.print(item.getItem() + " ");    item = item.getProximoItem();}
  • Tec. em Sistemas para Internet - IFMS 25Utilizando a lista encadeada genéricaListaEncadeadaGenerica<Double> listaEncadeada = new ListaEncadeadaGenerica<Double>();listaEncadeada.adicionarNoInicio(2.54);listaEncadeada.adicionarNoInicio(­123.234);listaEncadeada.adicionarNoInicio(0.1735);listaEncadeada.adicionarNoFinal(76D);listaEncadeada.adicionarNaPosicao(­981.39, 2);NoGenerico<Double> item = listaEncadeada.pegarItem(1);// Imprime na tela:// 0.1735 ­981.39 ­123.234 2.54 76.0while (item != null) {    System.out.print(item.getItem() + " ");    item = item.getProximoItem();}
  • Tec. em Sistemas para Internet - IFMS 26Classe Clientepublic class Cliente {    private String cpf;    private Date dataAniversario;    private String nomeCompleto;    private String endereco;    // Getters e setters para os atributos...    }
  • Tec. em Sistemas para Internet - IFMS 27Criando uma lista de clientesCliente cliente1 = new Cliente();cliente1.setNomeCompleto("Ana Leite");Cliente cliente2 = new Cliente();cliente2.setNomeCompleto("Augusto Macedo");Cliente cliente3 = new Cliente();cliente3.setNomeCompleto("Maria dos Anjos Toledo");ListaEncadeadaGenerica<Cliente> listaEncadeada = new ListaEncadeadaGenerica<Cliente>();listaEncadeada.adicionarNoFinal(cliente1);listaEncadeada.adicionarNoInicio(cliente2);listaEncadeada.adicionarNaPosicao(cliente3, 2);NoGenerico<Cliente> item = listaEncadeada.pegarItem(1);while (item != null) {    System.out.println(item.getItem().getNomeCompleto());    item = item.getProximoItem();}
  • Tec. em Sistemas para Internet - IFMS 28A interface List do pacote java.util●A interface List possui a definição de várias operaçõessobre listas●É a alternativa mais adotada pelos programadores Javapara a utilização de listas●Por ser uma interface, ela não contém a implementaçãodos seus métodos; apenas a assinatura destes.●Assim, existem duas implementações na JDK para o usoda interface List:●A classe ArrayList●A classe LinkedList
  • Tec. em Sistemas para Internet - IFMS 29Instanciando uma lista do tipo ListList<Integer> lista1 = new ArrayList<Integer>();List<Integer> lista2 = new LinkedList<Integer>();
  • Tec. em Sistemas para Internet - IFMS 30A classe ArrayList●A mais prática na maioria dos casos●Por baixo dos panos, ela:●Oferece de fato acesso direto a um item da lista●Não precisa alocar um novo nó para inserir um item novo●Na prática, a classe ArrayList implementa uma lista estática, detamanho inicial 10●Quando existe a necessidade de se inserir o décimo primeiroitem, a lista se redimensiona de forma implícita●No geral, tem melhor desempenho que a classe LinkedList
  • Tec. em Sistemas para Internet - IFMS 31A classe ArrayList(vantagens e desvantagens)●A mais prática na maioria dos casos●Por baixo dos panos, ela:●Oferece de fato acesso direto a um item da lista●Não precisa alocar um novo nó para inserir um item novo●Na prática, a classe ArrayList implementa uma lista estática,de tamanho inicial 10●Quando existe a necessidade de se inserir o décimo primeiroitem, a lista se redimensiona de forma implícita●No geral, tem melhor desempenho que a classe LinkedList
  • Tec. em Sistemas para Internet - IFMS 32A classe LinkedList●Implementa uma lista encadeada●O acesso ao primeiro e último ítens é feito de forma maisrápida do que o oferecido pela classe ArrayList●Por ser uma lista encadeada, o acesso aos ítensintermediários não é feito de forma direta●Não costuma ser mais prática que ArrayList na maioriados casos●Possui um melhor desempenho quando a inserção,leitura e remoção dos ítens da lista costumam ocorrernas pontas da lista
  • Tec. em Sistemas para Internet - IFMS 33A classe LinkedList(vantagens e desvantagens)●Implementa uma lista encadeada●O acesso ao primeiro e último ítens é feito de formamais rápida do que o oferecido pela classe ArrayList●Por ser uma lista encadeada, o acesso aos ítensintermediários não é feito de forma direta●Não costuma ser mais prática que ArrayList namaioria dos casos●Possui um melhor desempenho quando a inserção,leitura e remoção dos ítens da lista costumam ocorrernas pontas da lista
  • Tec. em Sistemas para Internet - IFMS 34Utilizando a interface List●Como as classes ArrayList e LinkedListimplementam a classe List, elasobrigatoriamente possuem a mesma assinaturade métodos●Assim, independente da implementaçãoescolhida, o uso da interface List é feito damesma forma●A real diferença entre as implementações só épercebida em termos de desempenho
  • Tec. em Sistemas para Internet - IFMS 35Utilizando a interface ListClasse ExemploList(abaixo no blog)
  • Tec. em Sistemas para Internet - IFMS 36Adicionando ítens// Inserindo ítens no final da listalista.add(12);lista.add(­38);lista.add(827);// Inserindo ítens no início da listalista.add(0, 125);lista.add(0, ­387);lista.add(0, 82735);
  • Tec. em Sistemas para Internet - IFMS 37Concatenando duas listasList<Integer> listaExtra = new ArrayList<Integer>();listaExtra.add(11);listaExtra.add(22);listaExtra.add(33);// Adiciona todos os ítens da lista extra no final da // primeira listalista.addAll(listaExtra);
  • Tec. em Sistemas para Internet - IFMS 38Inserindo uma lista no meio da outralistaExtra.add(44);listaExtra.add(55);listaExtra.add(66);/** * Adiciona todos os ítens da lista extra na posição   * desejada da primeira lista */lista.addAll(3, listaExtra);
  • Tec. em Sistemas para Internet - IFMS 39Removendo ítens por índice/** * Removendo ítens da lista pelo índice. Na interface  * List, os elementos são indexados na forma  * [0..tamanho da lista ­ 1] */lista.remove(0);lista.remove(4);
  • Tec. em Sistemas para Internet - IFMS 40Removendo ítens por ocorrência/** * Removendo um item da lista caso ele exista. O cast  * para Object é necessário para que o compilador  * diferencie a chamada ao método de remoção por  * ocorrência do método de remoção por índice. Retorna  * true caso o item exista; false c.c. */lista.remove((Object) 77); // Retorna false
  • Tec. em Sistemas para Internet - IFMS 41Verificando a ocorrência de um item// Verifica se um item está contido na listaif (lista.contains(12)) {    System.out.println("A lista contém o item 12.");}
  • Tec. em Sistemas para Internet - IFMS 42Pegando o índice de um ítem// Imprime o índice da primeira ocorrência do item de // valor 125System.out.println(lista.indexOf((Object) 125));
  • Tec. em Sistemas para Internet - IFMS 43Verificando a ocorrência de uma sublista// Verifica se a lista contém uma sublistaif (lista.containsAll(listaExtra)) {    System.out.println("A primeira lista contém a lista extra!");}
  • Tec. em Sistemas para Internet - IFMS 44Substituindo um item// Substituindo o elemento da terceira posição da listalista.set(3, 42);
  • Tec. em Sistemas para Internet - IFMS 45Verificando se a lista está vazia// Verifica se a lista está vaziaif (lista.isEmpty()) {    System.out.println("A lista está vazia.");} else {    System.out.println("A lista contém " + lista.size() + " elemento(s).");}
  • Tec. em Sistemas para Internet - IFMS 46Verificando a última ocorrência de um valor na listaSystem.out.println("A última ocorrência de 55 se dá na posição "                   + lista.lastIndexOf(55));
  • Tec. em Sistemas para Internet - IFMS 47Pegando o tamanho da listaSystem.out.println("Tamanho atual da lista: " + lista.size());
  • Tec. em Sistemas para Internet - IFMS 48Pegando partes da lista/** * Pega uma parte da lista. O primeiro índice é inclusivo; o  * segundo é exclusivo. */List<Integer> outraLista = lista.subList(2, 4);
  • Tec. em Sistemas para Internet - IFMS 49Convertendo uma lista para vetor// Converte a lista de inteiros em um vetor de objetosObject[] vetor = lista.toArray();// Converte a lista de inteiros em um vetor de inteirosInteger[] vetorInteiros = new Integer[lista.size()];lista.toArray(vetorInteiros);
  • Tec. em Sistemas para Internet - IFMS 50Percorrendo uma listafor (int i = 0; i < lista.size(); i++) {    System.out.print(lista.get(i) + " ");}
  • Tec. em Sistemas para Internet - IFMS 51Percorrendo uma lista com o laço for eachfor (Integer item : lista) {    System.out.print(item + " ");}
  • Tec. em Sistemas para Internet - IFMS 52Thats not all, folks!Na próxima (e última) aula sobre listas, vamosempileirar e enfileirar algumas coisas...