Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos e Programação Orientada a Objetos Coleções ColeçõesColeções • A estrutura de coleções do Java (Java Collections Framework) oferece ao programador estruturas de dados pré-empacotadas e os métodos para manipular essas estruturas de dados. • Em vez de termos de criar estruturas de dados simplesmente utilizamos as estruturas de dadossimplesmente utilizamos as estruturas de dados disponibilizadas, sem ter a preocupação de como essas estruturas estão implementadas. • Com isso pode se programar de forma mais rápida no uso de coleções de objetos em memória, com melhor desempenho, maior velocidade e minimizando uso de recurso de memória ColeçõesColeções • A coleção é uma estrutura de dados – na realidade um objeto – que pode armazenar outros objetos. • As coleções são estruturadas por meio de interfaces que definem que operações uma aplicação pode executar sobre cada tipo de coleção. • Por sua vez, as implementações das interfaces das• Por sua vez, as implementações das interfaces das coleções, executam operações particulares, que são utilizadas de acordo com a necessidade da aplicação. • As classes e interfaces onde se encontram as coleções estão no pacote java.util. Entre as interfaces temos: Collection, List, Set e Map. Coleções Coleções -- InterfacesInterfaces Coleções Coleções -- ImplementaçõesImplementações java.util.List java.util.Set java.util.Map HashTableArrayList Vector HashMapTreeSet LinkedList TreeMapHashSet ColeçõesColeções • A interface Collection é interface raiz na hierarquia de coleções a partir da qual se derivam as interfaces Set e List. • A Map não deriva de Collection. • A interface Collection contém as operações para adicionar, retirar, comparar objetos da lista.adicionar, retirar, comparar objetos da lista. • A interface Collection fornece um método que devolve um objeto da classe Iterator, o qual permite a manipulação dos objetos existentes dentro da coleção. Coleções Coleções -- ListasListas • O mundo das coleções é muito extenso e não será totalmente coberto nesta apresentação. • Vamos abordar a interface Collection com ênfase na interface List que deriva de Collection. • Como classe de implementação da interface List,• Como classe de implementação da interface List, utilizaremos o ArrayList. • As demais interfaces e classes de implementações serão apenas definidas. Collection Collection Atuam sobre elementos individuais da coleção Atuam sobre todos os elementos da coleção size containsAll • A interface Collection define o seguinte conjunto de métodos. isEmpty addAll contains removeAll add clear remove toArray iterator ListList • Adiciona à Collection os métodos – add (int index, Object element) – set (int index, Object element) – Object get (int index) – int indexOf (Object element)– int indexOf (Object element) – int lastIndexOf (Object element) – List sublist (int from, int to) • É melhor precorrer uma lista utilizando o Iterator do que utilizando os métodos get e size Coleções Coleções -- ListasListas • Uma lista é uma coleção que permite elementos duplicados e mantém uma ordenação específica entre os elementos. • Há a garantia de que, quando percorrer a lista, os• Há a garantia de que, quando percorrer a lista, os elementos serão encontrados em uma ordem pré- determinada, definida na hora da inserção dos mesmos. Coleções Coleções -- ListasListas • A List é uma das interfaces que deriva da interface Collection. • Uma classe que implementa a interface List assim como num vetor simples tem o índice do primeiro elemento em zero. • Além dos métodos da interface herdados da Collection,• Além dos métodos da interface herdados da Collection, List fornece métodos para manipular objetos utilizando seus índices dentro da lista. • A interface List é implementada pelas classes ArrayList, LinkedList e Vector. Coleções Coleções -- ListasListas • ArrayList – é uma implementação da interface List como um vetor redimensionável, ou seja, a alocação de objetos é dinâmica, cresce à medida que novos objetos são inseridos, diferentemente do vetor simples que precisa de tamanho pré-determinado. • O comportamento e os recursos da classe ArrayList são• O comportamento e os recursos da classe ArrayList são semelhantes aos da classe Vector. • A LinkedList é uma implementação da interface List como um lista encadeada (que é uma lista em que os objetos estão interligados como referência entre eles). Aplicavel para implementação de estruturas de dados tais como pilhas, filas e árvores. Coleções Coleções -- ListasListas • ArrayList – é uma implementação da interface List como um vetor redimensionável, ou seja, a alocação de objetos é dinâmica, cresce à medida que novos objetos são inseridos, diferentemente do vetor simples que precisa de tamanho pré-determinado. • O comportamento e os recursos da classe ArrayList são• O comportamento e os recursos da classe ArrayList são semelhantes aos da classe Vector. • A diferença entre Vector e ArrayList é que a primeira é thread safe (controles sobre threads). Caso um objeto não vá ser usado entre diferentes threads, a implementação ArrayList tem operações mais rápidas. Coleções Coleções -- ListasListas • A LinkedList é uma implementação da interface List como um lista encadeada (que é uma lista em que os objetos estão interligados como referência entre eles). Aplicavel para implementação de estruturas de dados tais como pilhas, filas e árvores. Coleções Coleções -- ConjuntosConjuntos • Set é uma Collection que contém elementos únicos. • A interface está implementada por meio das classes HashSet e TreeSet. • HashSet armazena seus objetos em uma tabela de hash. • TreeSet – armazena seus objetos em forma de árvore.• TreeSet – armazena seus objetos em forma de árvore. • Considere usar um Set se não houver a necessidade de guardar os elementos em determinada ordem e buscá-los através de um índice. A pesquisa é bem mais rápida. Coleções Coleções -- MapeamentosMapeamentos • Um mapa é muito usado para “indexar” objetos de acordo com determinado critério, para podermos buscá- los rapidamente através desse critério • Maps associam chaves a valores e não podem conter chaves duplicadas, isto é, cada chave pode mapear somente um elemento.somente um elemento. • Maps diferem de Sets no fato de que Maps contém chaves e valores, ao passo que Sets contém somente chaves. Coleções Coleções -- MapeamentosMapeamentos • As classes HashTable, HashMap e TreeMap implementam a interface Map. • HashMap e HashTable armazenam os objetos em tabelas e TreeMaps armazenam os elementos em árvores. • HashTable e HashMap são bem similares, ficando a• HashTable e HashMap são bem similares, ficando a diferença na questão de controle de Threads assim como as implementações ArrayList e Vector. Coleções Coleções -- IteratorIterator • O Iterator está baseado no padrão de projeto Iterator, que permite o acesso a objetos individuais de qualquer estrutura de dados, sem conhecer o comportamento da estrutura. • As instruções para percorrer a estrutura de dados e acessar seus elementos são armazenadas em umacessar seus elementos são armazenadas em um objeto que se chama iterador. • Cada estrutura de dados pode criar um iterador. Coleções Coleções -- IteratorIterator • Para navegar pelos objetos de uma coleção devemos utilizar o Iterator. • Os principais métodos: – hasNext() - verifica se existem mais elementos. – next() - recupera o próximo elemento. – remove() - remove um elemento.– remove() - remove um elemento. ArrayListArrayList • A classe ArrayList é uma classe que permite a implementação de uma lista de objetos na memória. • Com já citado, a lista de objetos funciona na forma deum vetor dinâmico, ou seja, o vetor cresce à medida que mais objetos são inseridos. A alocação de memória é dinâmica.é dinâmica. • Um ArrayList pode conter qualquer tipo de objeto. Um ArrayList pode ser caracterizado para conter um único tipo objeto ArrayListArrayList • Para criar um ArrayList, basta chamar o construtor: ArrayList lista = new ArrayList(); • É sempre possível abstrair a lista a partir da interface List:List: List lista = new ArrayList(); • A abstração do tipo de dado de lista pelo nome da interface permite que você troque a implementação ArrayList por outra implementação com a alteração mínima do código. ArrayListArrayList Objeto lista Produto prod = null; List< Produto> lista = new ArrayList< Produto>(); prod = new Produto(45, “Mouse”, 50); lista.add(prod); prod = new Produto(15, “Placa Video”, 100); lista.add(prod); prod = new Produto(58, “Monitor 20p”, 40); lista.add(prod); 32 Mouse 50 16 Placa Vídeo 100 58 Monitor 20p 40 Objeto lista Indice 0 Atributo codigo Atributo descrição Atributo qtde Indice 1 Indice 2 lista.size(); (3) Objetos da classe Produto ArrayList ArrayList –– manuseio de objetosmanuseio de objetos • Embora na lista anterior tenhamos inserido apenas um mesmo tipo de objeto, a implementação do ArrayList trata-os com o objeto genérico. • Podemos obter o tamanho da lista por meio de lista.size(). • Para obter um objeto de dentro da lista podemos fazê-lo por meio do método get, passando o índice correspondente. Produto p = (Produto) lista.get(1); • Observe que mesmo sendo uma lista de mesmo tipo de objeto, tivemos que fazer um casting para recuperar um objeto da lista. ArrayList ArrayList –– manuseio de objetosmanuseio de objetos • É importante ressaltar que o método get apenas retorna a referência de memória onde está armazenado o objeto cujo índice na lista é 1. • Para remover um objeto da lista você terá que chamar o método remove na forma abaixo. lista.remove(1); • Considerando o exemplo da lista anterior, a nova lista passa a ter apenas 2 elementos com os indices 0 e 1 apontando para os elementos restantes. ArrayList ArrayList –– manuseio de objetosmanuseio de objetos • Com a utilização do Iterator, temos o código abaixo. ProdutoDAO dao = new ProdutoDAO(); List lista = dao.listaProdutosDAO(); Iterator iLista = lista.iterator(); while (iLista.hasNext()){ Produto prod = (Produto)iLista.next(); txtArea.append(prod.getDescricao()+"\n"); } • O trecho de código considera que temos um método que retorna uma lista de produtos. Dessa lista utilizamos o método iterator que nos retorna uma instância de Iterator. Observe o casting. • Em seguida a descrição dos produtos são listadas numa área de texto de uma janela Swing. ArrayList ArrayList (Generics)(Generics) • Geralmente, não nos interessa uma lista com vários tipos de objetos misturados. • Podemos usar o recurso de Generics para restringir as listas a um determinado tipo de objetos (e não qualquer Object). • Podemos restringir a lista a ter apenas objetos da classe Produto, conforme exemplo. List<Produto> lista = new ArrayList<Produto>(); • Repare no uso de um parâmetro ao lado de List e ArrayList: ele indica que nossa lista foi criada para trabalhar exclusivamente com objetos do tipo Produto. ArrayList ArrayList (Generics)(Generics) • Com isso a recuperação de um objeto não precisa mais passar pelo casting visto que o compilador já assumiu o tipo de objeto da lista. Produto p = lista.get(1); • A recuperação em laço via Iterator fica agora na forma• A recuperação em laço via Iterator fica agora na forma abaixo. Observe a tipagem também da classe Iterator. ProdutoDAO dao = new ProdutoDAO(); List<Produto> lista = dao.listaProdutosDAO(); Iterator<Produto> iLista = lista.iterator(); while (iLista.hasNext()){ Produto prod = iLista.next(); txtArea.append(prod.getDescricao()+"\n"); } Obtenção e Construção da ListaObtenção e Construção da Lista • Com base nos exemplos anteriores e considerando que a classe Dao faz o acesso aos dados, a obtenção dos objetos da classe Produto e a construção da lista em memória passa a ser feita pelo método listaProdutosDAO da classe DAO. • Todo o código do método é dado no slide seguinte.• Todo o código do método é dado no slide seguinte. Obtenção e Construção da ListaObtenção e Construção da Lista public List<Produto> listaProdutosDAO() throws Exception { Produto produto = null; List<Produto> listaProdutos = new ArrayList<Produto>(); try { String sql = "SELECT * FROM TBProdutos"; Statement comandoSQL = conexao.createStatement(); ResultSet resultado = comandoSQL.executeQuery(sql); while (resultado.next()) { int cod = resultado.getInt("codigo"); String desc = resultado.getString("descricao");String desc = resultado.getString("descricao"); int qtde = resultado.getInt("qtde"); produto = new Produto(cod, desc, qtde); listaProdutos.add(produto); } if (listaProdutos.isEmpty()) throw new Exception("Não há produto cadastrado"); else return listaProdutos; } finally { conexao.close(); } } Apresentação dos dadosApresentação dos dados • O código abaixo apresenta o uso de um for tradicional. No entanto, observe o que foi dito sobre o uso do size e get. ProdutoDAO dao = new ProdutoDAO(); List<Produto> lista = dao.listaProdutosDAO();List<Produto> lista = dao.listaProdutosDAO(); for (int i = 0; i < lista.size(); i++){ Produto prod = lista.get(i); txtArea.append(prod.getDescricao()+"\n"); } Apresentação dos dadosApresentação dos dados • Já o código abaixo apresenta uma forma alternativa do uso do for para percorrer os dados da lista. ProdutoDAO dao = new ProdutoDAO(); List<Produto> lista = dao.listaProdutosDAO(); for (Produto prod : lista)for (Produto prod : lista) txtArea.append(prod.getDescricao()+"\n");
Compartilhar