Programação Orientada por Objectos - Aula 4

  • Published on
    18-Nov-2014

  • View
    1.522

  • Download
    0

Embed Size (px)

DESCRIPTION

Aula terica 4 da unidade (disciplina) de Programao Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2. semestre do ano lectivo de 2009/2010.

Transcript

  • 1. Aula 4
    A infra-estrutura aplicacional de coleces do Java
    (Java Collections Framework)
  • 2. Na aula anterior
    Interfaces
    Listas e listas ligadas
    Iteradores
    2009/2010
    Programao Orientada por Objectos
    2
  • 3. Infra-estrutura aplicacional de coleces do Java
    Infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vrios tipos de coleco em Java
    Coleces
    Agregados estruturados de elementos
    Cada tipo de coleco tem propriedades especficas
    Tm diferentes eficincias a realizar operaes equivalentes
    2009/2010
    Programao Orientada por Objectos
    3
    Java Collections Framework (JCF)
  • 4. JCF: tipos de coleco
    2009/2010
    Programao Orientada por Objectos
    4
    Legenda:
    E tipo dos elementos
    K tipo das chaves de um mapa
    V tipo dos valores de um mapa
    ? caracterstica depende do tipo concreto
    Intrnseca Ordem depende do valor dos elementos (ou da chave)
    Extrnseca Ordem depende da forma de insero e remoo dos elementos.
  • 5. JCF: principais interfaces
    2009/2010
    Programao Orientada por Objectos
    5
    E
    E
    interface
    Iterable
    interface
    Collection
    E
    K,V
    E
    E
    interface
    Set
    interface
    List
    interface
    Queue
    interface
    Map
    Um conjunto ordenado um conjunto.
    Uma coleco itervel.
    E
    E
    K,V
    interface
    SortedSet
    interface
    Deque
    interface
    SortedMap
  • 6. JFC: estruturas de dados subjacentes
    2009/2010
    Programao Orientada por Objectos
    6
  • 7. JCF: elementos, chaves e valores
    Tm de implementar
    booleanequals(Objectanother)
    inthashCode()
    Operaes so fornecidas pela classe Object!
    Podem ser sobrepostas (com cuidado)
    Se one.equals(another)ento one.hashCode() == another.hashCode()
    Outras restries
    2009/2010
    Programao Orientada por Objectos
    7
    Para procurar.
    Para tabelas de endereamento calculado.
  • 8. JCF: classes concretas
    2009/2010
    Programao Orientada por Objectos
    8
  • 9. JCF: classes concretas
    2009/2010
    Programao Orientada por Objectos
    9
    E
    E
    interface
    RandomAccess
    interface
    List
    interface
    Queue
    E
    interface
    Deque
    E
    E
    E
    ArrayList
    Vector
    PriorityQueue
    E
    E
    E
    LinkedList
    ArrayDeque
    Stack
  • 10. JCF: classes concretas
    2009/2010
    Programao Orientada por Objectos
    10
    E
    K,V
    interface
    Set
    interface
    Map
    E
    K,V
    E
    K,V
    interface
    SortedSet
    interface
    SortedMap
    HashMap
    HashSet
    E
    K,V
    K,V
    K,V
    TreeSet
    TreeMap
    LinkedHashMap
    LinkedHashSet
  • 11. JCF: one.compareTo(another)
    2009/2010
    Programao Orientada por Objectos
    11
  • 12. JCF: Boas prticas
    Classe implementa compareTo? Ento de valor
    Logo, deve sobrepor a sua especializao de equals
    pois por omisso equals compara identidade e no igualdade!
    As operaes compareTo e equals devem ser consistentes
    ou seja, one.compareTo(another) == 0 deve resultar no mesmo que one.equals(another)
    2009/2010
    Programao Orientada por Objectos
    12
  • 13. public class Rational implements Comparable {
    private final int numerator;
    private final int denominator;

    public intcompareTo(final Rational another){
    return getNumerator() * another.getDenominator()
    - another.getNumerator() * getDenominator();
    }

    }
    Aplicao classe Rational
    2009/2010
    Programao OrientadaporObjectos
    13
    interface
    ComparableRational>
    Rational
  • 14. public class Rational implements Comparable {

    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;
    }

    }
    Aplicao classe Rational
    2009/2010
    Programao OrientadaporObjectos
    14
  • 15. public class Rational implements Comparable {
    private final int numerator;
    private final int denominator;

    public inthashCode() {
    return (getNumerator() + getDenominator())
    * (getNumerator() + getDenominator() + 1)
    + getDenominator();
    }

    }
    Aplicao classe Rational
    2009/2010
    Programao OrientadaporObjectos
    15
  • 16. JCF: List e ArrayList
    final List courses =
    new ArrayList();
    final Course Ip = new Course("IP");
    final Course Poo = new Course("POO");
    courses.add(Ip); // adiciona ao fim
    courses.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/2010
    Programao Orientada por Objectos
    16
    comum usar um tipo mais genrico para aceder a uma coleco do que a classe real do objecto referenciado. Dessa forma pode-se alterar essa classe alterando apenas uma linha de cdigo.
    Far sentido indexar uma lista? E se se mudar a classe real para LinkedList?
    Remoo fora do ciclo? O.K.
    Remoo dentro do ciclo? Bronca!
  • 17. JCF: Vector
    final Vector courses =
    new Vector();
    final Course Ip = new Course("IP");
    final Course Poo = new Course("POO");
    courses.add(Ip); // adiciona ao fim
    courses.add(Poo);
    for (int i = 0; i != courses.size(); i++)
    out.println(courses.get(i));
    2009/2010
    Programao Orientada por Objectos
    17
  • 18. JCF: Stack
    final Stack courses =
    new Stack();
    final Course Ip = new Course("IP");
    final Course Poo = new Course("POO");
    courses.push(Ip); //adiciona no topo
    courses.push(Poo);
    while (!courses.isEmpty()) {
    out.println(courses.peek());
    courses.pop();
    }
    2009/2010
    Programao Orientada por Objectos
    18
  • 19. JCF: List, LinkedList e Iterator
    final List courses =
    new LinkedList();

    final Course Esi = new Course("ES I");

    final Iterator iterator =
    courses.iterator();
    while (iterator.hasNext()) {
    Course course = iterator.next();
    if (course == Esi)
    iterator.remove();
    }
    2009/2010
    Programao Orientada por Objectos
    19
    Dois em um: avana e devolve. Muito discutvel!
    Remoo segura: removido o ltimo elemento devolvido por next().
  • 20. JCF: LinkedList e Queue
    final Queue courses = new LinkedList();
    final Course Ip = new Course("IP");
    final Course Poo = new Course("POO");
    courses.add(Ip); // adicionaaoincio
    courses.add(Poo); // adicionaaoincio
    out.println(courses.element());
    out.println(courses.element());
    final Iterator iterator = courses.iterator();
    while (iterator.hasNext()) {
    Course course = iterator.next();
    out.println(course);
    }
    2009/2010
    Programao Orientada por Objectos
    20
    Mais uma vez, dois em um
  • 21. JCF: LinkedList e Deque
    final Deque courses = new LinkedList();
    final Course Ip = new Course("IP");
    final Course Poo = new Course("POO");
    courses.addFirst(Ip); // adicionaaoincio
    courses.addLast(Poo); // adicionaaofim
    out.println(courses.getFirst());
    out.println(courses.getLast());
    final Iterator iterator = courses.iterator();
    while (iterator.hasNext()) {
    Course course = iterator.next();
    out.println(course);
    }
    2009/2010
    Programao Orientada por Objectos
    21
    Mais uma vez, dois em um
  • 22. Ciclo for-each
    final List courses =
    new LinkedList();
    for (Course course : courses)
    out.println(course);
    2009/2010
    Programao Orientada por Objectos
    22
    Modo de iterao compacto, s