Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Listas (parte 2 de 3)

1,240 views

Published on

  • Be the first to comment

Listas (parte 2 de 3)

  1. 1. Tecnologia em Sistemas para Internet - IFMSAula 05 – Listas (parte 2)Estruturas de DadosProf.º Msc. Sidney Roberto de Sousasidney.sousa@ifms.edu.br
  2. 2. 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
  3. 3. 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
  4. 4. 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!
  5. 5. 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!?
  6. 6. 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!
  7. 7. Tec. em Sistemas para Internet - IFMS 7Vamos realmente fazer isto?
  8. 8. 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!
  9. 9. 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!
  10. 10. Tec. em Sistemas para Internet - IFMS 10Classes NoGenerico e ListaEncadeadaGenerica(abaixo no blog)
  11. 11. 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...}
  12. 12. 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.
  13. 13. 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.
  14. 14. 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.
  15. 15. 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.
  16. 16. 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.
  17. 17. 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.
  18. 18. 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
  19. 19. 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...}
  20. 20. 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.
  21. 21. 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.
  22. 22. 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++;}
  23. 23. 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++;}
  24. 24. 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();}
  25. 25. 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();}
  26. 26. 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...    }
  27. 27. 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();}
  28. 28. 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
  29. 29. Tec. em Sistemas para Internet - IFMS 29Instanciando uma lista do tipo ListList<Integer> lista1 = new ArrayList<Integer>();List<Integer> lista2 = new LinkedList<Integer>();
  30. 30. 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
  31. 31. 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
  32. 32. 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
  33. 33. 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
  34. 34. 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
  35. 35. Tec. em Sistemas para Internet - IFMS 35Utilizando a interface ListClasse ExemploList(abaixo no blog)
  36. 36. 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);
  37. 37. 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);
  38. 38. 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);
  39. 39. 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);
  40. 40. 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
  41. 41. 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.");}
  42. 42. 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));
  43. 43. 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!");}
  44. 44. Tec. em Sistemas para Internet - IFMS 44Substituindo um item// Substituindo o elemento da terceira posição da listalista.set(3, 42);
  45. 45. 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).");}
  46. 46. 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));
  47. 47. Tec. em Sistemas para Internet - IFMS 47Pegando o tamanho da listaSystem.out.println("Tamanho atual da lista: " + lista.size());
  48. 48. 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);
  49. 49. 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);
  50. 50. Tec. em Sistemas para Internet - IFMS 50Percorrendo uma listafor (int i = 0; i < lista.size(); i++) {    System.out.print(lista.get(i) + " ");}
  51. 51. Tec. em Sistemas para Internet - IFMS 51Percorrendo uma lista com o laço for eachfor (Integer item : lista) {    System.out.print(item + " ");}
  52. 52. Tec. em Sistemas para Internet - IFMS 52Thats not all, folks!Na próxima (e última) aula sobre listas, vamosempileirar e enfileirar algumas coisas...

×