Técnicas de Projeto e Implementação de Sistemas I TCC Prof.: Diego Passos

Documentos relacionados
Técnicas de Programação Avançada TCC Prof.: Anselmo Montenegro

Técnicas de Programação Avançada TCC Prof.: Anselmo Montenegro

Técnicas de Programação Avançada TCC Profs.: Anselmo Montenegro

Técnicas de Programação Avançada TCC Profs.: Anselmo Montenegro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

API e Coleções Java. Sérgio Luiz Ruivace Cerqueira

Coleções. Prof. Marcelo Roberto Zorzan

Coleções. João Paulo Q. dos Santos

Programação Orientada a Objetos

Paradigmas da Programação PPROG GENÉRICOS. (Livro Big Java, Late Objects Capítulo 18) Nelson Freire (ISEP DEI-PPROG 2014/15) 1/23

Prof. Fernando V. Paulovich 8 de novembro de SCC Programação Orientada a Objetos

Orientação a Objetos AULA 09

1. Por que não utilizar a notação de composição da UML para mostrar que um cachorro é composto de altura, peso, cor e data de nascimento?

Atividade 08 - Utilizando Collections - List

Collections. Programação Orientada por Objetos (POO) Centro de Cálculo Instituto Superior de Engenharia de Lisboa

Java Util Collections - Interfaces Interfaces definidas

Programação Orientada a Objetos. Collections - Java

Programação II Java Collections Framework (JCF) Christopher Burrows

Desenvolvimento e Projeto de Aplicações Web

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Collections Framework

Coleções em Java. Prof. Gustavo Willam Pereira ENG10082 Programação II. Créditos: Prof. Clayton Vieira Fraga Filho

Instituto Federal de Educação, Ciência e Tecnologia da Bahia Campus Irecê Disciplina: Linguagem Técnica II Prof o Jonatas Bastos

TIPOS PARAMETRIZADOS CLASSES GENÉRICAS PARTE II

Java Collections Framework II

Programação OO em Java

Programação com genéricos

Lista encadeada class No { Coleções. Enumeration. Lista encadeada (continuação) Enumeration Exemplo usando a classe Lista anterior

UFCG - CEEI DSC Grupo PET Computação Ciclo de Seminários

Computação II Orientação a Objetos

Métodos Genéricos. Prof.: Michele Nasu Tomiyama Bucci

PCC104 - Projeto e Análise de Algoritmos

Profa. Thienne Johnson EACH/USP

Java Standard Edition (JSE)

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

01/06/2016 INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS. Programa Capítulo 15. Coleções. A Interface List. A Classe LinkedList. Exercício.

Generics - Java. Fernando Santos. Programação Orientada a Objetos

Classes e Objetos. Sintaxe de classe em Java

Programação por Objectos. Java

Linguagem de Programação Orientada a Objeto Coleções

Programação Orientada a Objetos com Java. Prof. Júlio Machado

Programação orientada a objetos em Java

Interfaces POO. Prof. Marcio Delamaro

Notas de Aula 07: vetores de objetos e coleções

AULA 6 - ARRAYS. Array de 10 elementos

JAVA COLLECTIONS API: LISTAS

Coleções. Profa. Thienne Johnson EACH/USP

APIs Java: Tratamento de exceções e Coleções

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

4 Conceito de Herança

Análise e Projeto Orientados por Objetos

Introdução. Universidade Federal de Uberlândia. Programação Orientada a Objetos. Prof. Fabiano Dorça

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Conceitos de Interface; classes abstratas; Diagrama de sequencia, Diagrama de atividades, classes aninhadas e Listas dinâmicas

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

5. Generics, Iterators e Comparable em Java

Programação por Objectos. Java

ESTRUTURAS DE DADOS E ALGORITMOS HEAP BINÁRIA

Generics. Byron Leite e Bruno Fernandes. Orientação a objetos com Java. 1 Generics

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Palavras Reservadas da Linguagem Java

Genéricos. Profa. Thienne Johnson EACH/USP

A classe ArrayList. IFSC/Florianópolis - Programação Orientada a Objetos com Java - prof. Herval Daminelli

Paradigmas da Programação PPROG. Tipos de Dados. Enumerados Genéricos Coleções. Nelson Freire (ISEP DEI-PPROG 2012/13) 1/64

Computação II Orientação a Objetos

Herança e Polimorfismo - Parte I -

Java Coleções. Rodrigo C. de Azevedo

Algoritmos e Programação II. Coleções. Coleções. Baseado no material do Prof. Julio

Linguagem de Programação II Implementação

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

Computação II Orientação a Objetos

A Relação de Subtipo e Tipos Genéricos

Programação Orientada a Objetos

Aula 11 POO 1 Coleções e Arquivos. Profa. Elaine Faria UFU

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

Aula 03 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Linguagem de programação Programação Orientada a objetos

Programação Orientada por Objectos 2007/2008

Herança e Polimorfismo -Parte I - Mário Meireles Teixeira O exemplo DoME. Database of Multimedia Entertainment

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Programação Orientada a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

BSI UFRPE Prof. Gustavo Callou

Coleções - continuação. Profa. Thienne Johnson EACH/USP

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Programação Orientada a Objetos (utilizando C#) Professor Emiliano S. Monteiro Versão 20 Jan/2017.

Programação Orientada a Objetos

Transcrição:

Técnicas de Projeto e Implementação de Sistemas I TCC-00175 Prof.: Diego Passos Conteúdo:Tipos Genéricos (Revisão) Adaptado dos material original cedido pelo Prof. Anselmo Montenegro Baseado em http://docs.oracle.com/javase/tutorial/java/ generics/)

Java Generics Definição Java provê sintaxe que permite a definição de tipos (classes e interfaces) e métodos genéricos. Estes tipos e métodos genéricos possuem código que pode operar sobre dados de tipos quaisquer ou sobre um subconjunto potencialmente infinito de tipos, garantindo segurança de tipos em tempo de compilação. Dizemos que estes tipos ou métodos são parâmetrizados em relação a tipo. 04/09/2014 Técnicas de Programação Avançada 2

Java Generics Declaração de Tipos Genéricos Um tipo genérico (classe ou interface) é declarada da seguinte forma: class name<t1, T2,..., Tn> { /*... */ parâmetro de tipo A seção dos parâmetros de tipo é delimitada pelos símbolos (<>) e vem após o nome da classe. T1, T2,..., and Tn podem ser quaisquer tipos não primitivos. 04/09/2014 Técnicas de Programação Avançada 3

Java Generics Exemplo de Tipos Genéricos public class Box { Classe não genérica private Object object; public void set(object object) { this.object = object; Versão genérica da mesma classe public class Box<T> { // T stands for "Type" private T t; public void set(t t) { this.t = t; public Object get() { return object; public T get() { return t; 04/09/2014 Técnicas de Programação Avançada 4

Java Generics Exemplo de Tipos Genéricos Classe não genérica public class Pair { private Object key; private Object value; public void setkey(object key) { this.key = key; public Object getkey() { return key; public void setvalue(object value) { this.value = value; public Object getvalue() { return key; Versão genérica da mesma classe public class Pair <K,V> { private K key; private V value; public void setkey(k key) { this.key = key; public K getkey() { return key; public void setvalue(v value) { this.value = value; public V getvalue() { return key; 04/09/2014 Técnicas de Programação Avançada 5

Java Generics Invocação de Tipos Genéricos Para referenciar e usar uma classe genérica no código é necessário fazer uma invocação de tipo genérico A invocação de tipo genérico substitui um parâmetro de tipo, por exemplo T, com algum valor concreto Exemplo: Box<Integer> integerbox; argumento de tipo Uma invocação de um tipo genérico é análoga a uma invocação de um método; ao invés de passarmos um argumento para um método, passamos um argumento de tipo 04/09/2014 Técnicas de Programação Avançada 6

Java Generics Invocação de Tipos Genéricos Invocação de método: o.setvalue(37); o.setkeyvalue("nome", "Jose"); Invocação de tipo genérico: Box<Pessoa> b; Pair<String,Integer> p; 04/09/2014 Técnicas de Programação Avançada 7

Java Generics Instanciação de Tipos Genéricos A invocação é apenas uma declaração e não cria um novo objeto. Apenas indica que a variável irá conter uma referência para a classe/interface declarado que ela deve atuar sobre o parâmetro de tipo especificado. Para instanciar um classe, usamos a palavra new, e colocamos o argumento de tipo no lugar do parâmetro de tipo Box<Integer> integerbox = new Box<Integer>(); Box<Integer> integerbox = new Box<>(); 04/09/2014 Técnicas de Programação Avançada 8

Java Generics Métodos Genéricos Métodos genéricos são métodos que definem e utilizam seus próprios parâmetros de tipo. O escopo do parâmetro de tipo é limitado ao método em que é declarado. São permitidos métodos estáticos, não-estáticos e construtores de classes genéricos. 04/09/2014 Técnicas de Programação Avançada 9

Java Generics Métodos Genéricos public class Util { // Generic static method public static <K, V> boolean compare(pair<k, V> p1, Pair<K, V> p2) { return p1.getkey().equals(p2.getkey()) && p1.getvalue().equals(p2.getvalue()); public class Pair<K, V> { private K key; private V value; // Generic constructor public Pair(K key, V value) { this.key = key; this.value = value; // Generic methods public void setkey(k key) { this.key = key; public void setvalue(v value) { this.value = value; public K getkey() { return key; public V getvalue() { return value; 04/09/2014 Técnicas de Programação Avançada 10

Java Generics Métodos Genéricos É possível declarar métodos com seus próprios parâmetros de tipo em uma classe que já seja parametrizada. Exemplo: class Box <T> { T value; public T getvalue() { return value; public void setvalue(t value) { this.value = value; public <T2> void printvalue(t2 prefix) { System.out.print(prefix); System.out.println(value); 04/09/2014 Técnicas de Programação Avançada 11

Java Generics Métodos Genéricos Métodos estáticos obrigatoriamente devem declarar seus parâmetros de tipo, mesmo se pertencem a classes parametrizadas: class Util <T> { public static <T> void metodoqualquer(t argumento) { No exemplo, T não é o mesmo para a classe e para o método. Declaração é necessária pois métodos estáticos são independentes das instâncias da classe. Cada instância da classe Util define o valor do tipo T sob o qual irá operar. 04/09/2014 Técnicas de Programação Avançada 12

Java Generics Invocação de Métodos Genéricos Sintaxe para a invocação de método genérico Pair<Integer, String> p1 = new Pair<>(1, "apple"); Pair<Integer, String> p2 = new Pair<>(2, "pear"); boolean same = Util.<Integer, String>compare(p1, p2); Usando inferência de tipos: argumentos de tipo Pair<Integer, String> p1 = new Pair<>(1, "apple"); Pair<Integer, String> p2 = new Pair<>(2, "pear"); boolean same = Util.compare(p1, p2); Geralmente, pode ser suprimido 04/09/2014 Técnicas de Programação Avançada 13

Java Generics Parâmetros de tipo restritos Considere o seguinte problema: Escreva um método genérico que conte o número de elementos em um array T[] que sejam maiores que um elemento elem public static <T> int countgreaterthan(t[] anarray, T elem) { int count = 0; for (T e : anarray) if (e > elem) // Erro de compilação! Operador'>' é definido para T? ++count; return count; 04/09/2014 Técnicas de Programação Avançada 14

Java Generics Parâmetros de tipo restritos O tipo dos argumentos em um parâmetro de tipo pode ser restringido quando necessário. Exemplo: um método que opera sobre números somente deve aceitar instâncias de Number ou de suas subclasses. Útil quando o código é genérico, mas precisa utilizar alguma característica específica de alguns tipos. 04/09/2014 Técnicas de Programação Avançada 15

Java Generics Parâmetros de tipo restritos public interface Comparavel { public int comparea(object o); public static <T extends Comparavel> int countgreaterthan( T[] anarray, T elem) { int count = 0; for (T e : anarray) if (e.comparea(elem) > 0) ++count; return count; Tipos T que implementam Comparavel tem o método comparea 04/09/2014 Técnicas de Programação Avançada 16

Java Generics Parâmetros de tipo restritos public class Pessoa implements Comparavel { int altura; public void setaltura(int altura) { this.altura = altura; public int getaltura() {return altura; public int comparea(object o) { Pessoa p = (Pessoa) o; return(altura p.getaltura());... Pessoa[] pessoas =... Pessoa joao =... Integer i = countgreaterthan(pessoas, joao); 04/09/2014 Técnicas de Programação Avançada 17

Java Generics Parâmetros de tipo restritos public class Pessoa implements Comparavel { int altura; public void setaltura(int altura) { this.altura = altura; public int getaltura() {return altura; public int comparea(object o) { Pessoa p = (Pessoa) o; return(altura p.getaltura());... Pessoa[] pessoas =... Pessoa joao =... Integer i = countgreaterthan(pessoas, joao); Casting pode trazer problemas. Como evitar? 04/09/2014 Técnicas de Programação Avançada 18

Java Generics Parâmetros de tipo restritos Interface Comparavel deve se adequar a qualquer tipo de objetos que podem ser comparados. Por isso, o argumento do método comparea é do tipo Object. Qual é a alternativa? Transformar a interface Comparavel em uma interface parametrizada. Classe Pessoa implementará a interface instanciada sobre o próprio tipo Pessoa. 04/09/2014 Técnicas de Programação Avançada 19

Java Generics Parâmetros de tipo restritos public interface Comparavel<T> { public int comparea(t o); public class Pessoa implements Comparavel<Pessoa> { int altura; public void setaltura(int altura) { this.altura = altura; public int getaltura() {return altura; public int comparea(pessoa p) { return(altura p.getaltura()); 04/09/2014 Técnicas de Programação Avançada 20

Java Generics Parâmetros de tipo restritos múltiplos Parâmetros de tipo podem ter restrições múltiplas. Exemplo: <T extends B1 & B2 & B3> Uma variável de tipo com restrições múltiplas e subtipo de todos os tipos listados na restrição. Classes devem ser especificadas primeiro na listagem declarativa. 04/09/2014 Técnicas de Programação Avançada 21

Cuidado ao analisar classes/interfaces genéricas instanciados com tipos e subtipos. Sejam A e B classes (ou interfaces) tal que B A. Seja G<> uma classe/interface genérica. Então não é verdade que G<B> G<A> Java Generics Genéricos e subtipos 04/09/2014 Técnicas de Programação Avançada 22

Java Generics Genéricos e subtipos 04/09/2014 Técnicas de Programação Avançada 23

Considere o problema de imprimir todos os elementos de uma coleção Solução com genéricos: void printcollection(collection<object> c) { for (Object e : c) System.out.println(e); Java Generics Genéricos e subtipos Problemas? 04/09/2014 Técnicas de Programação Avançada 24

Java Generics Genéricos e Subtipos void printcollection(collection<object> c) { for (Object e : c) System.out.println(e); Problema: Collection<Object> não é um supertipo de todas as coleções possíveis. Não podemos passar um Collection<Integer> como argumento, por exemplo. 04/09/2014 Técnicas de Programação Avançada 25

Qual o supertipo de todas as coleções possíveis? Resposta: Collection<?> Collection<?> é denominada coleção de desconhecidos? é um símbolo denominado wildcard O Wildcard é um tipo desconhecido Java Generics Wildcards 04/09/2014 Técnicas de Programação Avançada 26

Solução para imprimir uma coleção usando genéricos void printcollection(collection<?> c) { for (Object e : c) System.out.println(e); Java Generics Wildcards É importante obter objetos Object da coleção É seguro porque todo objeto em uma coleção qualquer é um Object 04/09/2014 Técnicas de Programação Avançada 27

Java Generics Wildcards Solução alternativa: void <T> printcollection(collection<t> c) { for (T e : c) System.out.println(e); Funciona? 04/09/2014 Técnicas de Programação Avançada 28

Java Generics Wildcards Solução alternativa: void <T> printcollection(collection<t> c) { for (T e : c) System.out.println(e); Funciona? Sim. Via de regra, podemos substituir o Wildcard com um parâmetro de tipo e alcançar o mesmo resultado. 04/09/2014 Técnicas de Programação Avançada 29

Em alguns casos, a segunda opção (sem wildcard) é preferível ou até necessária. Exemplo 1: public <T extends Set> T firstof(list<t> l) { return l.get(0); ou public Set firstof(list<? extends Set> l) { return l.get(0); Java Generics Wildcards Primeira versão garante retorno do mesmo tipo da lista. SubSet s = firstof( // Erro de compilação com a segunda versão (precisa de cast) 04/09/2014 Técnicas de Programação Avançada 30

Exemplo 2. Suponha um método que recebe duas listas de um subtipo de Set. Queremos garantir que ambas as listas sejam exatamente do mesmo tipo. Como? public <T extends Set> T metodo(list<t> a, List<T> b) { Wildcards não seriam suficientes. Java Generics Wildcards 04/09/2014 Técnicas de Programação Avançada 31

Qual a utilidade dos wildcards, então? Utilidade 1: Wildcards permitem criar variáveis que recebem referências para instâncias quaisquer de tipos genéricos. Collection<?> c = new ArrayList<String>(); Object o = c.get(); c.add(new Object()); // Compile time error Java Generics Wildcards atribuição de objetos a coleção de genéricos Mas nem todas as operações podem ser feitas sobre essa variável. 04/09/2014 Técnicas de Programação Avançada 32

Qual a utilidade dos wildcards, então? Java Generics Wildcards simplificação de código Utilidade 2: em algumas situações, reduzem o tamanho do código. static <T1, T2, T3, T4, T5> void metodo(list<t1> l1, List<T2> l2, List<T3>, List<T4>, List<T5>) { ou static void metodo(list<?> l1, List<?> l2, List<?>, List<?>, List<?>) { 04/09/2014 Técnicas de Programação Avançada 33

Qual a utilidade dos wildcards, então? Java Generics Wildcards simplificação de código Utilidade 3: em algumas situações, declarações de parâmetros de tipo utilizando Wildcards facilitam a inferência de tipos pelo compilador na chamada de métodos. 04/09/2014 Técnicas de Programação Avançada 34

Java Generics Uso do super interface Sink<T> { public void flush(t t); public static <T> T writeall(collection<t> coll, Sink<T> snk) { T last; for (T t : coll) { last = t; snk.flush(last); return last; Sink<Object> s; Collection<String> cs; String str = writeall(cs, s); // Illegal call. Se T é String, Sink<Object> não é subtipo de Sink<String> Se T é Object, Collection<String> não é subtipo de Collection<Object> 04/09/2014 Técnicas de Programação Avançada 35

Java Generics Uso do super interface Sink<T> { flush(t t); public static <T> T writeall(collection<? extends T>, Sink<T>) { T last; for (T t : coll) { last = t; snk.flush(last); return last; Sink<Object> s; Collection<String> cs; String str = writeall(cs, s); // Call is OK, but wrong return type. T passa ser inferido como Object. Mas T também é o tipo de retorno do método. 04/09/2014 Técnicas de Programação Avançada 36

Java Generics Uso do super interface Sink<T> { flush(t t); public static <T> T writeall(collection<t>, Sink<? super T>) { T last; for (T t : coll) { last = t; snk.flush(last); return last; Sink<Object> s; Collection<String> cs; String str = writeall(cs, s); // OK!!! Palavra chave super: qualquer supertipo de T. T passa a ser resolvido para String e o tipo do segundo parâmetro para Sink<Object> 04/09/2014 Técnicas de Programação Avançada 37

Java Generics Uso do super Solução sem Wildcard? interface Sink<T> { flush(t t); public static <T, T2 extends T> T writeall(collection<t2> coll, Sink<T> snk) { T2 last; for (T2 t : coll) { last = t; snk.flush(last); return last; Sink<Object> s; Collection<String> cs; String str = writeall(cs, s); // OK!!! 04/09/2014 Técnicas de Programação Avançada 38

Java Generics Uso do super Mas cuidado: interface Sink<T> { flush(t t); public static <T, T2 super T> T writeall(collection<t> coll, Sink<T2> snk) { T2 last; for (T2 t : coll) { last = t; snk.flush(last); return last; Sink<Object> s; Collection<String> cs; String str = writeall(cs, s); Erro de sintaxe na definição do método! 04/09/2014 Técnicas de Programação Avançada 39

Java Generics Restrições sobre tipos genéricos Não é possível instanciar tipos genéricos com tipos primitivos Pair<int, char> p = new Pair<>(8, 'a'); // compile-time error vs Pair<Integer, Character> p = new Pair<>(8, 'a'); 04/09/2014 Técnicas de Programação Avançada 40

Java Generics Restrições sobre tipos genéricos Não é possível criar instâncias de tipos parametrizados public static <E> void append(list<e> list) { E elem = new E(); // compile-time error list.add(elem); Corolário: não é possível instanciar arrays de tipos genéricos public class Pilha<T> { T[] elementos = new T[100]; // erro de compilação public class Pilha<T> { Object[] elementos = new Object[100]; // Ok 04/09/2014 Técnicas de Programação Avançada 41

Java Generics Restrições sobre tipos genéricos Não é possível declarar campos estáticos cujos tipos sejam parametrizados public class MobileDevice<T> { private static T os; //... MobileDevice<Smartphone> phone = new MobileDevice<>(); MobileDevice<Pager> pager = new MobileDevice<>(); MobileDevice<TabletPC> pc = new MobileDevice<>(); 04/09/2014 Técnicas de Programação Avançada 42

Orientação a Objetos Exercícios (obtidos da página da oracle http://docs.oracle.com/javase/tutorial/java/ generics/qande/generics-questions.html) 1 - Escreva um método genérico que conte o número de elementos em uma lista que possua alguma propriedade específica (exemplo de propriedade: ser palíndromo, ser ímpar...). 2- A classe a seguir compila? Se não, justifique. public final class Algorithm { public static T max(t x, T y) { return x > y? x : y; 3 - Escreva um método genérico que troque as posições de dois elementos em um array. 4 - Escreva um método genérico que retorne o elemento máximo em uma lista cuja posição esteja no intervalo [begin,end). 04/09/2014 Técnicas de Programação Avançada 43

Técnicas de Projeto e Implementação de Sistemas I Prof.: Diego Passos dpassos@ic.uff.br Conteúdo: Coleções Slides baseados no material original cedido pelo Prof. Anselmo Montenegro. Material elaborado com contribuição do Professor Luiz André

Coleções Coleções são estruturas de dados para armazenamento de objetos de natureza comum. Também chamadas de containers. Exemplos: Mão em jogo de cartas. Lista telefônica. Pasta de e-mails. 04/09/2014 Técnicas de Programação Avançada 2

Coleções Framework de coleções Java: Arquitetura unificada para representação e manipulação de coleções. É composto de: Interfaces: tipos abstratos que representam as coleções. Implementações: implementações concretas das coleções. Algoritmos: métodos que executam tarefas comuns sobre as coleções. 04/09/2014 Técnicas de Programação Avançada 3

Coleções: Vantagens Facilitam a tarefa de programação. Incluem estruturas de dados usadas corriqueiramente. Reduzem a possibilidade de bugs. Código das estruturas é bem testado. Aumentam a compatibilidade entre módulos. Módulos tendem a usar as mesmas implementações das estruturas. 04/09/2014 Técnicas de Programação Avançada 4

Coleções: Interfaces Tipos de coleções disponíveis no Framework de Java: 04/09/2014 Técnicas de Programação Avançada 5

Collection Collection Nível mais alto de abstração Contém as operações comuns a todas as coleções 04/09/2014 Técnicas de Programação Avançada 6

Percorrendo uma Coleção Até o JavaSE 7, havia duas maneiras de percorrer uma coleção: Construção do tipo for-each: for (Object o : collection) System.out.println(o); Construção do tipo iterator: static void filter(collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasnext(); ) if (!cond(it.next())) it.remove(); 04/09/2014 Técnicas de Programação Avançada 7

Operações do Tipo Bulk Operações que operam sobre conjuntos de elementos (ao invés de um único). containsall: retorna verdadeiro se a coleção alvo contêm todos os elementos na coleção especificada. addall: adiciona todos os elementos da coleção especificada na coleção alvo. removeall: remove da coleção alvo todos os elementos que também estão contidos na coleção especificada. retainall: remove da coleção alvo todos os elementos que não estão contidos na coleção especificada. clear: remove todos os elementos da coleção. Exemplo: Collection c1 =...; Collection c2 =...; c1.addall(c2); // c1 passa a ter todos os elementos de c1 e de c2. 04/09/2014 Técnicas de Programação Avançada 8

Conversão de Coleção para Array Uma coleção pode ser convertida para um array de duas formas: Object[] a = c.toarray(); // Método genérico. String[] a = c.toarray(new String[0]); 04/09/2014 Técnicas de Programação Avançada 9

Conversão de Coleção para Coleção Uma coleção pode ser convertida (ou copiada) para uma outra coleção: TipoColecao2 c2 = new TipoColecao2(c1); Todos os elementos de c1 são automaticamente adicionados a c2. Se as coleções são de tipos diferentes, conversões são realizadas. 04/09/2014 Técnicas de Programação Avançada 10

Orientação a Objetos Set Set Conjunto de objetos que não pode conter elementos duplicados Equivale ao conceito matemático de conjunto 04/09/2014 Técnicas de Programação Avançada 11

Set: Exemplo Suponha o seguinte problema: Escrever um programa que remova todas as duplicatas dos argumentos da linha de comando. Facilmente implementável com set. public class FindDups { public static void main(string[] args ) { Set<String> s = new HashSet<String>(); for (String a : args) s.add(a); System.out.println(s.size() + " distinct words : " +s); 04/09/2014 Técnicas de Programação Avançada 12

Set: Operações Bulk Operações do tipo bulk permitem a implementação de operações de teoria dos conjuntos. Exemplos: união, interseção e diferença. Set<Type> union = new HashSet<Type>(s1); union.addall(s2); Set<Type> intersection = new HashSet<Type>(s1); intersection.retainall(s2); Set<Type> difference = new HashSet<Type>(s1); difference.removeall(s2); 04/09/2014 Técnicas de Programação Avançada 13

Set: Elementos Duplicados O que acontece quando tentamos adicionar um elemento que já existe? Um set não pode ter duplicadas. Elemento não é adicionado de novo. Método add retorna false. Também acontece quando tentamos remover um elemento que não existe. E também vale para operações bulk. De forma geral, métodos retornam se a coleção foi alterada. 04/09/2014 Técnicas de Programação Avançada 14

Set: Exemplo Considere uma variação do problema das duplicatas: Queremos também saber quais são os elementos que se repetem. public class FindDups2 { public static void main(string[] args) { Set<String> uniques = new HashSet<String>(); Set<String> dups = new HashSet<String>(); for (String a : args){ if (!uniques.add(a)) dups.add(a); // Destructive set-difference uniques.removeall(dups); System.out.println("Unique words: " + uniques); System.out.println("Duplicate words: " + dups); 04/09/2014 Técnicas de Programação Avançada 15

SortedSet SortedSet Conjunto objetos classificados em ordem crescente Ordem é usada para definir iteração sobre elementos Também permite operações de range 04/09/2014 Técnicas de Programação Avançada 16

List List Conjunto ordenado de objetos Pode conter elementos duplicados 04/09/2014 Técnicas de Programação Avançada 17

List: Exemplo Métodos swap e shuffle: public static <E> void swap(list<e> a, int i, int j) { E tmp = a.get(i); a.set(i, a.get(j)); a.set(j, tmp); public static void shuffle(list<?> list, Random rnd) { for (int i = list.size(); i > 1; i--){ swap(list, i - 1, rnd.nextint(i)); 04/09/2014 Técnicas de Programação Avançada 18

List: A Classe Collections Classe Collections oferece vários métodos estáticos sobre coleções. Ordenação, busca,... Exemplo de uso: método shuffle. public class Shuffle { public static void main(string[] args) { List <String> list = new ArrayList<String>(); for (String a : args){ list.add(a); Collections.shuffle(list, new Random()); System.out.println(list ); 04/09/2014 Técnicas de Programação Avançada 19

List: Transformando Array em List A classe Arrays fornece o método estático aslist(). Converte um array em um List do mesmo tipo de dados. public class Shuffle { public static void main(string[] args) { List<String> list = Arrays.asList(args); Collections.shuffle(list); System.out.println(list); 04/09/2014 Técnicas de Programação Avançada 20

Percorrimento de Listas Listas podem ser percorridas como outras coleções quaisquer. Mas há também um tipo de iterator específico para coleções do tipo List. O ListIterator. Permite percorrer a lista para frente ou para trás. for (ListIterator<Type> it = list.listiterator(list.size()); it.hasprevious (); ){ Type t = it.previous ();... 04/09/2014 Técnicas de Programação Avançada 21

ListIterator Método listiterator tem duas formas: com ou sem parâmetro. Quando chamamos a forma sem parâmetro, o listiterator é colocado no início da lista. Quando especificamos o parâmetro, ele é colocado na posição indicada. 04/09/2014 Técnicas de Programação Avançada 22

ListIterator A qualquer momento, o cursor encontra-se entre dois elementos: O next() e o previous(). 04/09/2014 Técnicas de Programação Avançada 23

Orientação a Objetos Queue Queue Fila de objetos Ordenação pode ser FIFO ou determinada por prioridade 04/09/2014 UFF/IC Técnicas de Programação Avançada 04/09/2014 24

Queue: Exemplo Podemos implementar um heapsort utilizando uma Queue do tipo PriorityQueue. static <E> List<E> heapsort(collection<e> c) { Queue<E> queue = new PriorityQueue<E>(c); List<E> result = new ArrayList<E>(); while(!queue.isempty()) result.add(queue.remove ()); return result ; 04/09/2014 Técnicas de Programação Avançada 25

Map Map Conjunto de objetos acessados por chaves Não pode conter chave duplicadas Cada chave está associada a somente um objeto 04/09/2014 UFF/IC Técnicas de Programação Avançada 04/09/2014 26

Map: Exemplo Considere o seguinte problema: Calcule a frequência de ocorrência de cada string especificada como parâmetro de um programa. public class Freq { public static void main(string[] args) { Map<String, Integer> m = new HashMap<String, Integer>(); // Initialize frequency table from command line for (String a : args) { Integer freq = m.get(a); m.put(a, (freq == null)? 1 : freq + 1); System.out.println(m.size() + " distinct words:"); System.out.println(m); 04/09/2014 Técnicas de Programação Avançada 27

Orientação a Objetos SortedMap SortedMap Mantém as chaves classificadas em ordem crescente 04/09/2014 Técnicas de Programação Avançada 28

Orientação a Objetos Collection & Map 04/09/2014 Técnicas de Programação Avançada 29

Coleções Ordenadas Várias das implementações das interfaces em no Java Collections estabelecem uma ordem específica nos elementos. Há três tipos de ordem usadas nas implementações: Ordem de inserção: elementos são ordenados de acordo com seu momento de inserção na coleção. LinkedList, LinkedHashSet, LinkedHashMap. Ordem natural. Ordem via Comparator. 04/09/2014 Técnicas de Programação Avançada 30

Ordem Natural Classes que implementam a interface comparable tem uma ordem natural. Algum critério de comparação que estabelece uma relação de ordenação total. Exemplo: números reais (maior que), pessoas (mais alta), números complexos (módulo é maior que). 04/09/2014 Técnicas de Programação Avançada 31

Ordem Natural Se o tipo de dados (classe) implementa a interface comparable, certas coleções utilizam esta relação de ordem para manter os elementos ordenados. PriorityQueue, TreeSet, TreeMap. public interface Comparable<T> { int compareto(t o); 04/09/2014 Técnicas de Programação Avançada 32

A Interface Comparator Se um tipo não apresenta uma ordem natural (não implementa a interface Comparable) ou se desejamos manter a ordem baseada em outro critério, podemos usar a interface Comparator. public interface Comparator<T> { int compare(t o1, T o2); 04/09/2014 Técnicas de Programação Avançada 33

A Interface Comparator: Exemplo Suponha uma classe Empregado. Empregado contém nome, data de contratação, número,... Suponha que a classe estabelece uma ordem natural sobre o atributo nome. public class Empregado implements Comparable<Empregado> { public String name; public int number; public Date hiredate;... 04/09/2014 Técnicas de Programação Avançada 34

A Interface Comparator: Exemplo Vamos armazenar uma coleção ordenada de Empregados. Pergunta: como manter a coleção ordenada pela data de contratação? 04/09/2014 Técnicas de Programação Avançada 35

A Interface Comparator class EmpSort implements Comparator<Empregado> { public int compare(empregado e1, Empregado e2) { return -e2.datacontratacao.compareto(e1.datacontratacao); public class Teste { public static void main(string[] args) { Queue<Empregado> q = new PriorityQueue<Empregado>(10, new EmpSort()); q.add(new Empregado("Joao", new Date(94, 11, 3))); q.add(new Empregado("Jose", new Date(89, 1, 31))); q.add(new Empregado("Mario", new Date(92, 4, 6))); q.add(new Empregado("Carlos", new Date(91, 6, 17))); System.out.println(q); 04/09/2014 Técnicas de Programação Avançada 36

O Método Sort Também pode-se usar a ordem natural ou a interface Comparator para ordenar uma lista: List<Empregado> q = new ArrayList<Empregado>(); q.add(new Empregado("Joao", new Date(94, 11, 3))); q.add(new Empregado("Jose", new Date(89, 1, 31))); q.add(new Empregado("Mario", new Date(92, 4, 6))); q.add(new Empregado("Carlos", new Date(91, 6, 17))); Collections.sort(q, new EmpSort()); 04/09/2014 Técnicas de Programação Avançada 37

Orientação a Objetos Coleções - Implementações HashSet Ordena objetos em hash table TreeSet Ordena objetos em árvore Objetos armazenados devem implementar interface Comparable LinkedHashSet Armazena a ordem de entrada dos elementos em uma lista duplamente encadeada Ordem de iteração preserva ordem de entrada ArrayList Armazena objetos em vetor de tamanho dinâmico simples LinkedList Lista duplamente encadeada FIFO PriorityQueue Heap TreeMap Ordena chave em árvore HashMap Ordena chave em hash table LinkedHashMap Mantém a ordem em que os elementos foram incluídos no mapa em uma lista duplamente encadeada A ordem de inserção é preservada em iterações sobre as chaves 04/09/2014 Técnicas de Programação Avançada 38

Exemplos Dias da semana: segunda, terça, etc. Frutas: morango, mamão, abacaxi, etc. A ordem dos valores é definida Os elementos são literais constantes Definição Java Orientação a Objetos Tipos Especiais de Coleções - Enumerações public enum Day { SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO, DOMINGO; Comparação Day day = Day.SEGUNDA; System.out.println(day.compareTo(Day.TERCA)); 04/09/2014 Técnicas de Programação Avançada 39

Orientação a Objetos Tipos Especiais de Coleções - Enumerações public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.0268e7), URANUS (8.686e+25, 2.5559e7), NEPTUNE (1.024e+26, 2.4746e7);... private final double mass; private final double radius; public static final double G = 6.67300E-11;... Planet(double mass, double radius) { this.mass = mass; this.radius = radius; private double mass() { return mass; private double radius() { return radius; public double surfacegravity() { return G * mass / (radius * radius); public double surfaceweight(double othermass){ return othermass * surfacegravity(); public static void main(string[] args) { Planet planet = Planet.MARS; System.out.println(planet.surfaceWeight(72)); 04/09/2014 Técnicas de Programação Avançada 40

Orientação a Objetos Referências Collections: http://docs.oracle.com/javase/tutorial/collections/ Collections Interfaces :http://docs.oracle.com/javase/tutorial/collections/interfaces/index.html Collections Implementations : http://docs.oracle.com/javase/tutorial/collections/implementations/inde x.html Collections Algorithms: http://docs.oracle.com/javase/tutorial/collections/algorithms/index.html 04/09/2014 Técnicas de Programação Avançada 41