Aula 4A infra-estrutura aplicacional de colecções do Java(Java Collections Framework)
Na aula anterior…InterfacesListas e listas ligadasIteradores2009/2010Programação Orientada por Objectos2
Infra-estrutura aplicacional de colecções do JavaInfra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em JavaColecçõesAgregados estruturados de elementosCada tipo de colecção tem propriedades específicasTêm diferentes eficiências a realizar operações equivalentes2009/2010Programação Orientada por Objectos3Java Collections Framework (JCF)
JCF: tipos de colecção2009/2010Programação Orientada por Objectos4Legenda:E – tipo dos elementosK – tipo das chaves de um mapaV – tipo dos valores de um mapa? – característica depende do tipo concretoIntrínseca – Ordem depende do valor dos elementos (ou da chave)Extrínseca – Ordem depende da forma de inserção e remoção dos elementos.
JCF: principais interfaces2009/2010Programação Orientada por Objectos5EE«interface»Iterable«interface»CollectionEK,VEE«interface»Set«interface»List«interface»Queue«interface»Map“Um conjunto ordenado é um conjunto.”“Uma colecção é iterável.”EEK,V«interface»SortedSet«interface»Deque«interface»SortedMap
JFC: estruturas de dados subjacentes2009/2010Programação Orientada por Objectos6
JCF: elementos, chaves e valoresTêm de implementarbooleanequals(Objectanother)inthashCode()Operações são fornecidas pela classe Object!Podem ser sobrepostas (com cuidado)Se one.equals(another)então one.hashCode() == another.hashCode()Outras restrições2009/2010Programação Orientada por Objectos7Para procurar.Para tabelas de endereçamento calculado.
JCF: classes concretas2009/2010Programação Orientada por Objectos8
JCF: classes concretas2009/2010Programação Orientada por Objectos9EE«interface»RandomAccess«interface»List«interface»QueueE«interface»DequeEEEArrayListVectorPriorityQueueEEELinkedListArrayDequeStack
JCF: classes concretas2009/2010Programação Orientada por Objectos10EK,V«interface»Set«interface»MapEK,VEK,V«interface»SortedSet«interface»SortedMapHashMapHashSetEK,VK,VK,VTreeSetTreeMapLinkedHashMapLinkedHashSet
JCF: one.compareTo(another)2009/2010Programação Orientada por Objectos11
JCF: Boas práticasClasse implementa compareTo? Então é de valorLogo, deve sobrepor a sua especialização de equals……pois por omissão equals compara identidade e não igualdade!As operações compareTo e equals devem ser consistentes……ou seja, one.compareTo(another) == 0 deve resultar no mesmo que one.equals(another)2009/2010Programação Orientada por Objectos12
public class Rational implements Comparable<Rational> {    private final int numerator;    private final int denominator;    …    public intcompareTo(final Rational another){        return getNumerator() * another.getDenominator()             - another.getNumerator() * getDenominator();    }    …}Aplicação à classe Rational2009/2010Programação OrientadaporObjectos13«interface»Comparable<T->Rational>Rational
public class Rational implements Comparable<Rational> {    …    public boolean equals(final Object obj) {        if (this == obj)            return true;        if (obj == null || getClass() != obj.getClass())            return false;        final Rational other = (Rational) obj;        return denominator == other.denominator            && numerator == other.numerator;    }    …}Aplicação à classe Rational2009/2010Programação OrientadaporObjectos14
public class Rational implements Comparable<Rational> {    private final int numerator;    private final int denominator;    …    public inthashCode() {        return (getNumerator() + getDenominator())             * (getNumerator() + getDenominator() + 1)             + getDenominator();    }    …}Aplicação à classe Rational2009/2010Programação OrientadaporObjectos15
JCF: List e ArrayListfinal List<Course> courses =    new ArrayList<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.add(Ip);  // adiciona ao fimcourses.add(Poo);int indexOfCourseToRemove = -1;for (int i = 0; i != courses.size(); i++)    if (courses.get(i) == Poo)        indexOfCourseToRemove = i;if (indexOfCourseToRemove != -1)    courses.remove(indexOfCourseToRemove);courses.remove(Ip);2009/2010Programação Orientada por Objectos16É comum usar um tipo mais genérico para aceder a uma colecção do que a classe real do objecto referenciado. Dessa forma pode-se alterar essa classe alterando apenas uma linha de código.Fará sentido indexar uma lista? E se se mudar a classe real para LinkedList?Remoção fora do ciclo? O.K.Remoção dentro do ciclo? Bronca!
JCF: Vectorfinal Vector<Course> courses =    new Vector<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.add(Ip);  // adiciona ao fimcourses.add(Poo);for (int i = 0; i != courses.size(); i++)    out.println(courses.get(i));2009/2010Programação Orientada por Objectos17
JCF: Stackfinal Stack<Course> courses =    new Stack<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.push(Ip);  //adiciona no topocourses.push(Poo);while (!courses.isEmpty()) {    out.println(courses.peek());    courses.pop();}2009/2010Programação Orientada por Objectos18
JCF: List, LinkedList e Iteratorfinal List<Course> courses =     new LinkedList<Course>();…final Course Esi = new Course("ES I");…final Iterator<Course> iterator =    courses.iterator();while (iterator.hasNext()) {    Course course = iterator.next();    if (course == Esi)        iterator.remove();}2009/2010Programação Orientada por Objectos19Dois em um: avança e devolve. Muito discutível!Remoção segura: É removido o último elemento devolvido por next().
JCF: LinkedList e Queuefinal Queue<Course> courses = new LinkedList<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.add(Ip); // adicionaaoiníciocourses.add(Poo); // adicionaaoinícioout.println(courses.element());out.println(courses.element());final Iterator<Course> iterator = courses.iterator();while (iterator.hasNext()) {    Course course = iterator.next();    out.println(course);}2009/2010Programação Orientada por Objectos20Mais uma vez,  dois em um…
JCF: LinkedList e Dequefinal Deque<Course> courses = new LinkedList<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.addFirst(Ip); // adicionaaoiníciocourses.addLast(Poo); // adicionaaofimout.println(courses.getFirst());out.println(courses.getLast());final Iterator<Course> iterator = courses.iterator();while (iterator.hasNext()) {    Course course = iterator.next();    out.println(course);}2009/2010Programação Orientada por Objectos21Mais uma vez,  dois em um…
Ciclo for-eachfinal List<Course> courses =     new LinkedList<Course>();for (Course course : courses)    out.println(course);2009/2010Programação Orientada por Objectos22Modo de iteração compacto, sem usar iterador, mas … de utilização limitada (não se pode alterar a colecção, não se pode facilmente percorrer subsequências da colecção, etc.).
JCF: Iteração e alteração concorrentesfinal List<Course> courses =     new LinkedList<Course>();…final Course Poo = new Course(“POO");…for (Course course : courses) {courses.remove(Poo);    out.println(course);}2009/2010Programação Orientada por Objectos23Alterações durante o ciclo produzem resultados inesperados. Pode mesmo ser lançada a excepção ConcurrentModificationException.
JCF: Map e HashMapfinal Map<String, Course> courses =     new HashMap<String, Course>();…courses.put("IP", new Course("Introdução à …"));…if (courses.containsKey("IP"))    out.println(courses.get("IP"));for (String key : courses.keySet())    out.println(key);for (Map.Entry<String, Course> entry : courses.entrySet())    out.println(entry);for (Course course : courses.values())    out.println(course);2009/2010Programação Orientada por Objectos24
JCF: Map e TreeMapfinal Map<String, Course> courses =     new TreeMap<String, Course>();…courses.put("IP", new Course("Introdução à …"));…if (courses.containsKey("IP"))    out.println(courses.get("IP"));for (String key : courses.keySet())    out.println(key);for (Map.Entry<String, Course> entry : courses.entrySet())    out.println(entry);for (Course course : courses.values())    out.println(course);2009/2010Programação Orientada por Objectos25
JCF: Queue e LinkedListQueue<String> courseNames =    new LinkedList<String>();courseNames.add("POO");courseNames.add("ES I");courseNames.add("IP");while(!courseNames.isEmpty()) {    out.println(courseNames.element());courseNames.remove();}2009/2010Programação Orientada por Objectos26
JCF: Queue e PriorityQueueQueue<String> courseNames =    new PriorityQueue<String>();courseNames.add("POO");courseNames.add(“ES I");courseNames.add("IP");while(!courseNames.isEmpty()) {    out.println(courseNames.element());    courseNames.remove();}2009/2010Programação Orientada por Objectos27
JCF: Boas práticas na utilização de colecçõesNão usar colecções de ObjectUsar o tipo de colecção mais adequadoAtentar na diferente eficiência das mesmas operações em diferentes tipos de colecção (consultar a documentação)Não alterar uma colecção durante uma iteração ao longo dos elementos (ou usar o iterador para o fazer)2009/2010Programação Orientada por Objectos28
JCF: Boas práticas na utilização de colecçõesAlteração de elementos de colecções com ordem intrínseca pode ter efeitos inesperadosUsar sempre classes (de valor) imutáveis quando for necessária ordem intrínsecaTer atenção à documentação: nem todas as colecções permitem a inserção de elementos nulos2009/2010Programação Orientada por Objectos29
A reter…A JCF é uma infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em JavaAs colecções são agregados estruturados de elementos, tendo cada tipo de colecção propriedades específicas, particularmente quanto à eficiência com que realiza cada operaçãoPara usar bem estas classes é necessário conhecer bem a documentação!2009/2010Programação Orientada por Objectos30
A ler para a próxima aula…Secção 18.6 do livro:Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-02009/2010Programação Orientada por Objectos31
Aula 4: SumárioA infra-estrutura aplicacional de colecções do Java (Java Collections Framework)2009/2010Programação Orientada por Objectos32

Programação Orientada por Objectos - Aula 4

  • 1.
    Aula 4A infra-estruturaaplicacional de colecções do Java(Java Collections Framework)
  • 2.
    Na aula anterior…InterfacesListase listas ligadasIteradores2009/2010Programação Orientada por Objectos2
  • 3.
    Infra-estrutura aplicacional decolecções do JavaInfra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em JavaColecçõesAgregados estruturados de elementosCada tipo de colecção tem propriedades específicasTêm diferentes eficiências a realizar operações equivalentes2009/2010Programação Orientada por Objectos3Java Collections Framework (JCF)
  • 4.
    JCF: tipos decolecção2009/2010Programação Orientada por Objectos4Legenda:E – tipo dos elementosK – tipo das chaves de um mapaV – tipo dos valores de um mapa? – característica depende do tipo concretoIntrínseca – Ordem depende do valor dos elementos (ou da chave)Extrínseca – Ordem depende da forma de inserção e remoção dos elementos.
  • 5.
    JCF: principais interfaces2009/2010ProgramaçãoOrientada por Objectos5EE«interface»Iterable«interface»CollectionEK,VEE«interface»Set«interface»List«interface»Queue«interface»Map“Um conjunto ordenado é um conjunto.”“Uma colecção é iterável.”EEK,V«interface»SortedSet«interface»Deque«interface»SortedMap
  • 6.
    JFC: estruturas dedados subjacentes2009/2010Programação Orientada por Objectos6
  • 7.
    JCF: elementos, chavese valoresTêm de implementarbooleanequals(Objectanother)inthashCode()Operações são fornecidas pela classe Object!Podem ser sobrepostas (com cuidado)Se one.equals(another)então one.hashCode() == another.hashCode()Outras restrições2009/2010Programação Orientada por Objectos7Para procurar.Para tabelas de endereçamento calculado.
  • 8.
  • 9.
    JCF: classes concretas2009/2010ProgramaçãoOrientada por Objectos9EE«interface»RandomAccess«interface»List«interface»QueueE«interface»DequeEEEArrayListVectorPriorityQueueEEELinkedListArrayDequeStack
  • 10.
    JCF: classes concretas2009/2010ProgramaçãoOrientada por Objectos10EK,V«interface»Set«interface»MapEK,VEK,V«interface»SortedSet«interface»SortedMapHashMapHashSetEK,VK,VK,VTreeSetTreeMapLinkedHashMapLinkedHashSet
  • 11.
  • 12.
    JCF: Boas práticasClasseimplementa compareTo? Então é de valorLogo, deve sobrepor a sua especialização de equals……pois por omissão equals compara identidade e não igualdade!As operações compareTo e equals devem ser consistentes……ou seja, one.compareTo(another) == 0 deve resultar no mesmo que one.equals(another)2009/2010Programação Orientada por Objectos12
  • 13.
    public class Rationalimplements Comparable<Rational> { private final int numerator; private final int denominator; … public intcompareTo(final Rational another){ return getNumerator() * another.getDenominator() - another.getNumerator() * getDenominator(); } …}Aplicação à classe Rational2009/2010Programação OrientadaporObjectos13«interface»Comparable<T->Rational>Rational
  • 14.
    public class Rationalimplements Comparable<Rational> { … public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; final Rational other = (Rational) obj; return denominator == other.denominator && numerator == other.numerator; } …}Aplicação à classe Rational2009/2010Programação OrientadaporObjectos14
  • 15.
    public class Rationalimplements Comparable<Rational> { private final int numerator; private final int denominator; … public inthashCode() { return (getNumerator() + getDenominator()) * (getNumerator() + getDenominator() + 1) + getDenominator(); } …}Aplicação à classe Rational2009/2010Programação OrientadaporObjectos15
  • 16.
    JCF: List eArrayListfinal List<Course> courses = new ArrayList<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.add(Ip); // adiciona ao fimcourses.add(Poo);int indexOfCourseToRemove = -1;for (int i = 0; i != courses.size(); i++) if (courses.get(i) == Poo) indexOfCourseToRemove = i;if (indexOfCourseToRemove != -1) courses.remove(indexOfCourseToRemove);courses.remove(Ip);2009/2010Programação Orientada por Objectos16É comum usar um tipo mais genérico para aceder a uma colecção do que a classe real do objecto referenciado. Dessa forma pode-se alterar essa classe alterando apenas uma linha de código.Fará sentido indexar uma lista? E se se mudar a classe real para LinkedList?Remoção fora do ciclo? O.K.Remoção dentro do ciclo? Bronca!
  • 17.
    JCF: Vectorfinal Vector<Course>courses = new Vector<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.add(Ip); // adiciona ao fimcourses.add(Poo);for (int i = 0; i != courses.size(); i++) out.println(courses.get(i));2009/2010Programação Orientada por Objectos17
  • 18.
    JCF: Stackfinal Stack<Course>courses = new Stack<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.push(Ip); //adiciona no topocourses.push(Poo);while (!courses.isEmpty()) { out.println(courses.peek()); courses.pop();}2009/2010Programação Orientada por Objectos18
  • 19.
    JCF: List, LinkedListe Iteratorfinal List<Course> courses = new LinkedList<Course>();…final Course Esi = new Course("ES I");…final Iterator<Course> iterator = courses.iterator();while (iterator.hasNext()) { Course course = iterator.next(); if (course == Esi) iterator.remove();}2009/2010Programação Orientada por Objectos19Dois em um: avança e devolve. Muito discutível!Remoção segura: É removido o último elemento devolvido por next().
  • 20.
    JCF: LinkedList eQueuefinal Queue<Course> courses = new LinkedList<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.add(Ip); // adicionaaoiníciocourses.add(Poo); // adicionaaoinícioout.println(courses.element());out.println(courses.element());final Iterator<Course> iterator = courses.iterator();while (iterator.hasNext()) { Course course = iterator.next(); out.println(course);}2009/2010Programação Orientada por Objectos20Mais uma vez, dois em um…
  • 21.
    JCF: LinkedList eDequefinal Deque<Course> courses = new LinkedList<Course>();final Course Ip = new Course("IP");final Course Poo = new Course("POO");courses.addFirst(Ip); // adicionaaoiníciocourses.addLast(Poo); // adicionaaofimout.println(courses.getFirst());out.println(courses.getLast());final Iterator<Course> iterator = courses.iterator();while (iterator.hasNext()) { Course course = iterator.next(); out.println(course);}2009/2010Programação Orientada por Objectos21Mais uma vez, dois em um…
  • 22.
    Ciclo for-eachfinal List<Course>courses = new LinkedList<Course>();for (Course course : courses) out.println(course);2009/2010Programação Orientada por Objectos22Modo de iteração compacto, sem usar iterador, mas … de utilização limitada (não se pode alterar a colecção, não se pode facilmente percorrer subsequências da colecção, etc.).
  • 23.
    JCF: Iteração ealteração concorrentesfinal List<Course> courses = new LinkedList<Course>();…final Course Poo = new Course(“POO");…for (Course course : courses) {courses.remove(Poo); out.println(course);}2009/2010Programação Orientada por Objectos23Alterações durante o ciclo produzem resultados inesperados. Pode mesmo ser lançada a excepção ConcurrentModificationException.
  • 24.
    JCF: Map eHashMapfinal Map<String, Course> courses = new HashMap<String, Course>();…courses.put("IP", new Course("Introdução à …"));…if (courses.containsKey("IP")) out.println(courses.get("IP"));for (String key : courses.keySet()) out.println(key);for (Map.Entry<String, Course> entry : courses.entrySet()) out.println(entry);for (Course course : courses.values()) out.println(course);2009/2010Programação Orientada por Objectos24
  • 25.
    JCF: Map eTreeMapfinal Map<String, Course> courses = new TreeMap<String, Course>();…courses.put("IP", new Course("Introdução à …"));…if (courses.containsKey("IP")) out.println(courses.get("IP"));for (String key : courses.keySet()) out.println(key);for (Map.Entry<String, Course> entry : courses.entrySet()) out.println(entry);for (Course course : courses.values()) out.println(course);2009/2010Programação Orientada por Objectos25
  • 26.
    JCF: Queue eLinkedListQueue<String> courseNames = new LinkedList<String>();courseNames.add("POO");courseNames.add("ES I");courseNames.add("IP");while(!courseNames.isEmpty()) { out.println(courseNames.element());courseNames.remove();}2009/2010Programação Orientada por Objectos26
  • 27.
    JCF: Queue ePriorityQueueQueue<String> courseNames = new PriorityQueue<String>();courseNames.add("POO");courseNames.add(“ES I");courseNames.add("IP");while(!courseNames.isEmpty()) { out.println(courseNames.element()); courseNames.remove();}2009/2010Programação Orientada por Objectos27
  • 28.
    JCF: Boas práticasna utilização de colecçõesNão usar colecções de ObjectUsar o tipo de colecção mais adequadoAtentar na diferente eficiência das mesmas operações em diferentes tipos de colecção (consultar a documentação)Não alterar uma colecção durante uma iteração ao longo dos elementos (ou usar o iterador para o fazer)2009/2010Programação Orientada por Objectos28
  • 29.
    JCF: Boas práticasna utilização de colecçõesAlteração de elementos de colecções com ordem intrínseca pode ter efeitos inesperadosUsar sempre classes (de valor) imutáveis quando for necessária ordem intrínsecaTer atenção à documentação: nem todas as colecções permitem a inserção de elementos nulos2009/2010Programação Orientada por Objectos29
  • 30.
    A reter…A JCFé uma infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em JavaAs colecções são agregados estruturados de elementos, tendo cada tipo de colecção propriedades específicas, particularmente quanto à eficiência com que realiza cada operaçãoPara usar bem estas classes é necessário conhecer bem a documentação!2009/2010Programação Orientada por Objectos30
  • 31.
    A ler paraa próxima aula…Secção 18.6 do livro:Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-02009/2010Programação Orientada por Objectos31
  • 32.
    Aula 4: SumárioAinfra-estrutura aplicacional de colecções do Java (Java Collections Framework)2009/2010Programação Orientada por Objectos32

Notas do Editor

  • #12 Consulte a documentação da interface Comparable, onde encontrará as propriedades que a operação compareTo tem de ter. É essencial fazê-lo antes de pensar em fornecer a sua própria implementação dessa operação.
  • #13 Consulte a documentação da interface Comparable, onde encontrará as propriedades que a operação compareTo tem de ter e de que forma deve ser consistente com equals. É essencial fazê-lo antes de pensar em fornecer a sua própria implementação dessas operações.Boas práticas:Definir ordenação intrínseca e noção de igualdade apenas para classes representando tipos de valor.Sempre que possível, torne os tipos de valor imutáveis.Consulte a documentação e as boas práticas do Java para garantir que as suas implementações das operações equals e compareTo são completas, correctas e consistentes. É mais difícil do que parece!