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

<ul><li> 1. Aula 4<br />A infra-estrutura aplicacional de coleces do Java<br />(Java Collections Framework)<br /></li> <li> 2. Na aula anterior<br />Interfaces<br />Listas e listas ligadas<br />Iteradores<br />2009/2010<br />Programao Orientada por Objectos<br />2<br /></li> <li> 3. Infra-estrutura aplicacional de coleces do Java<br />Infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vrios tipos de coleco em Java<br />Coleces<br />Agregados estruturados de elementos<br />Cada tipo de coleco tem propriedades especficas<br />Tm diferentes eficincias a realizar operaes equivalentes<br />2009/2010<br />Programao Orientada por Objectos<br />3<br />Java Collections Framework (JCF)<br /></li> <li> 4. JCF: tipos de coleco<br />2009/2010<br />Programao Orientada por Objectos<br />4<br />Legenda:<br />E tipo dos elementos<br />K tipo das chaves de um mapa<br />V tipo dos valores de um mapa<br />? caracterstica depende do tipo concreto<br />Intrnseca Ordem depende do valor dos elementos (ou da chave)<br />Extrnseca Ordem depende da forma de insero e remoo dos elementos.<br /></li> <li> 5. JCF: principais interfaces<br />2009/2010<br />Programao Orientada por Objectos<br />5<br />E<br />E<br />interface<br />Iterable<br />interface<br />Collection<br />E<br />K,V<br />E<br />E<br />interface<br />Set<br />interface<br />List<br />interface<br />Queue<br />interface<br />Map<br />Um conjunto ordenado um conjunto.<br />Uma coleco itervel.<br />E<br />E<br />K,V<br />interface<br />SortedSet<br />interface<br />Deque<br />interface<br />SortedMap<br /></li> <li> 6. JFC: estruturas de dados subjacentes<br />2009/2010<br />Programao Orientada por Objectos<br />6<br /></li> <li> 7. JCF: elementos, chaves e valores<br />Tm de implementar<br />booleanequals(Objectanother)<br />inthashCode()<br />Operaes so fornecidas pela classe Object!<br />Podem ser sobrepostas (com cuidado)<br />Se one.equals(another)ento one.hashCode() == another.hashCode()<br />Outras restries<br />2009/2010<br />Programao Orientada por Objectos<br />7<br />Para procurar.<br />Para tabelas de endereamento calculado.<br /></li> <li> 8. JCF: classes concretas<br />2009/2010<br />Programao Orientada por Objectos<br />8<br /></li> <li> 9. JCF: classes concretas<br />2009/2010<br />Programao Orientada por Objectos<br />9<br />E<br />E<br />interface<br />RandomAccess<br />interface<br />List<br />interface<br />Queue<br />E<br />interface<br />Deque<br />E<br />E<br />E<br />ArrayList<br />Vector<br />PriorityQueue<br />E<br />E<br />E<br />LinkedList<br />ArrayDeque<br />Stack<br /></li> <li> 10. JCF: classes concretas<br />2009/2010<br />Programao Orientada por Objectos<br />10<br />E<br />K,V<br />interface<br />Set<br />interface<br />Map<br />E<br />K,V<br />E<br />K,V<br />interface<br />SortedSet<br />interface<br />SortedMap<br />HashMap<br />HashSet<br />E<br />K,V<br />K,V<br />K,V<br />TreeSet<br />TreeMap<br />LinkedHashMap<br />LinkedHashSet<br /></li> <li> 11. JCF: one.compareTo(another)<br />2009/2010<br />Programao Orientada por Objectos<br />11<br /></li> <li> 12. JCF: Boas prticas<br />Classe implementa compareTo? Ento de valor<br />Logo, deve sobrepor a sua especializao de equals<br />pois por omisso equals compara identidade e no igualdade!<br />As operaes compareTo e equals devem ser consistentes<br />ou seja, one.compareTo(another) == 0 deve resultar no mesmo que one.equals(another)<br />2009/2010<br />Programao Orientada por Objectos<br />12<br /></li> <li> 13. public class Rational implements Comparable {<br /> private final int numerator;<br /> private final int denominator;<br /><br /> public intcompareTo(final Rational another){<br /> return getNumerator() * another.getDenominator()<br /> - another.getNumerator() * getDenominator();<br /> }<br /><br />}<br />Aplicao classe Rational<br />2009/2010<br />Programao OrientadaporObjectos<br />13<br />interface<br />ComparableRational&gt;<br />Rational<br /></li> <li> 14. public class Rational implements Comparable {<br /><br /> public boolean equals(final Object obj) {<br /> if (this == obj)<br /> return true;<br /> if (obj == null || getClass() != obj.getClass())<br /> return false;<br /> final Rational other = (Rational) obj;<br /> return denominator == other.denominator<br /> &amp;&amp; numerator == other.numerator;<br /> }<br /><br />}<br />Aplicao classe Rational<br />2009/2010<br />Programao OrientadaporObjectos<br />14<br /></li> <li> 15. public class Rational implements Comparable {<br /> private final int numerator;<br /> private final int denominator;<br /><br /> public inthashCode() {<br /> return (getNumerator() + getDenominator())<br /> * (getNumerator() + getDenominator() + 1)<br /> + getDenominator();<br /> }<br /><br />}<br />Aplicao classe Rational<br />2009/2010<br />Programao OrientadaporObjectos<br />15<br /></li> <li> 16. JCF: List e ArrayList<br />final List courses =<br /> new ArrayList();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.add(Ip); // adiciona ao fim<br />courses.add(Poo);<br />int indexOfCourseToRemove = -1;<br />for (int i = 0; i != courses.size(); i++)<br /> if (courses.get(i) == Poo)<br /> indexOfCourseToRemove = i;<br />if (indexOfCourseToRemove != -1)<br /> courses.remove(indexOfCourseToRemove);<br />courses.remove(Ip);<br />2009/2010<br />Programao Orientada por Objectos<br />16<br /> 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.<br />Far sentido indexar uma lista? E se se mudar a classe real para LinkedList?<br />Remoo fora do ciclo? O.K.<br />Remoo dentro do ciclo? Bronca!<br /></li> <li> 17. JCF: Vector<br />final Vector courses =<br /> new Vector();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.add(Ip); // adiciona ao fim<br />courses.add(Poo);<br />for (int i = 0; i != courses.size(); i++)<br /> out.println(courses.get(i));<br />2009/2010<br />Programao Orientada por Objectos<br />17<br /></li> <li> 18. JCF: Stack<br />final Stack courses =<br /> new Stack();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.push(Ip); //adiciona no topo<br />courses.push(Poo);<br />while (!courses.isEmpty()) {<br /> out.println(courses.peek());<br /> courses.pop();<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />18<br /></li> <li> 19. JCF: List, LinkedList e Iterator<br />final List courses = <br /> new LinkedList();<br /><br />final Course Esi = new Course("ES I");<br /><br />final Iterator iterator =<br /> courses.iterator();<br />while (iterator.hasNext()) {<br /> Course course = iterator.next();<br /> if (course == Esi)<br /> iterator.remove();<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />19<br />Dois em um: avana e devolve. Muito discutvel!<br />Remoo segura: removido o ltimo elemento devolvido por next().<br /></li> <li> 20. JCF: LinkedList e Queue<br />final Queue courses = new LinkedList();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.add(Ip); // adicionaaoincio<br />courses.add(Poo); // adicionaaoincio<br />out.println(courses.element());<br />out.println(courses.element());<br />final Iterator iterator = courses.iterator();<br />while (iterator.hasNext()) {<br /> Course course = iterator.next();<br /> out.println(course);<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />20<br />Mais uma vez, dois em um<br /></li> <li> 21. JCF: LinkedList e Deque<br />final Deque courses = new LinkedList();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.addFirst(Ip); // adicionaaoincio<br />courses.addLast(Poo); // adicionaaofim<br />out.println(courses.getFirst());<br />out.println(courses.getLast());<br />final Iterator iterator = courses.iterator();<br />while (iterator.hasNext()) {<br /> Course course = iterator.next();<br /> out.println(course);<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />21<br />Mais uma vez, dois em um<br /></li> <li> 22. Ciclo for-each<br />final List courses = <br /> new LinkedList();<br />for (Course course : courses)<br /> out.println(course);<br />2009/2010<br />Programao Orientada por Objectos<br />22<br />Modo de iterao compacto, sem usar iterador, mas de utilizao limitada (no se pode alterar a coleco, no se pode facilmente percorrer subsequncias da coleco, etc.).<br /></li> <li> 23. JCF: Iterao e alterao concorrentes<br />final List courses = <br /> new LinkedList();<br /><br />final Course Poo = new Course(POO");<br /><br />for (Course course : courses) {<br />courses.remove(Poo);<br /> out.println(course);<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />23<br />Alteraes durante o ciclo produzem resultados inesperados. Pode mesmo ser lanada a excepo ConcurrentModificationException.<br /></li> <li> 24. JCF: Map e HashMap<br />final Map courses = <br /> new HashMap();<br /><br />courses.put("IP", new Course("Introduo "));<br /><br />if (courses.containsKey("IP"))<br /> out.println(courses.get("IP"));<br />for (String key : courses.keySet())<br /> out.println(key);<br />for (Map.Entry entry : courses.entrySet())<br /> out.println(entry);<br />for (Course course : courses.values())<br /> out.println(course);<br />2009/2010<br />Programao Orientada por Objectos<br />24<br /></li> <li> 25. JCF: Map e TreeMap<br />final Map courses = <br /> new TreeMap();<br /><br />courses.put("IP", new Course("Introduo "));<br /><br />if (courses.containsKey("IP"))<br /> out.println(courses.get("IP"));<br />for (String key : courses.keySet())<br /> out.println(key);<br />for (Map.Entry entry : courses.entrySet())<br /> out.println(entry);<br />for (Course course : courses.values())<br /> out.println(course);<br />2009/2010<br />Programao Orientada por Objectos<br />25<br /></li> <li> 26. JCF: Queue e LinkedList<br />Queue courseNames =<br /> new LinkedList();<br />courseNames.add("POO");<br />courseNames.add("ES I");<br />courseNames.add("IP");<br />while(!courseNames.isEmpty()) {<br /> out.println(courseNames.element());<br />courseNames.remove();<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />26<br /></li> <li> 27. JCF: Queue e PriorityQueue<br />Queue courseNames =<br /> new PriorityQueue();<br />courseNames.add("POO");<br />courseNames.add(ES I");<br />courseNames.add("IP");<br />while(!courseNames.isEmpty()) {<br /> out.println(courseNames.element());<br /> courseNames.remove();<br />}<br />2009/2010<br />Programao Orientada por Objectos<br />27<br /></li> <li> 28. JCF: Boas prticas na utilizao de coleces<br />No usar coleces de Object<br />Usar o tipo de coleco mais adequado<br />Atentar na diferente eficincia das mesmas operaes em diferentes tipos de coleco (consultar a documentao)<br />No alterar uma coleco durante uma iterao ao longo dos elementos (ou usar o iterador para o fazer)<br />2009/2010<br />Programao Orientada por Objectos<br />28<br /></li> <li> 29. JCF: Boas prticas na utilizao de coleces<br />Alterao de elementos de coleces com ordem intrnseca pode ter efeitos inesperados<br />Usar sempre classes (de valor) imutveis quando for necessria ordem intrnseca<br />Ter ateno documentao: nem todas as coleces permitem a insero de elementos nulos<br />2009/2010<br />Programao Orientada por Objectos<br />29<br /></li> <li> 30. A reter<br />A JCF uma infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vrios tipos de coleco em Java<br />As coleces so agregados estruturados de elementos, tendo cada tipo de coleco propriedades especficas, particularmente quanto eficincia com que realiza cada operao<br />Para usar bem estas classes necessrio conhecer bem a documentao!<br />2009/2010<br />Programao Orientada por Objectos<br />30<br /></li> <li> 31. A ler para a prxima aula<br />Seco 18.6 do livro:<br />Y. Daniel Liang, Introduction to Java Programming, 7. edio, Prentice-Hall, 2008.ISBN: 978-0-13-605966-0<br />2009/2010<br />Programao Orientada por Objectos<br />31<br /></li> <li> 32. Aula 4: Sumrio<br />A infra-estrutura aplicacional de coleces do Java (Java Collections Framework)<br />2009/2010<br />Programao Orientada por Objectos<br />32<br /></li> </ul>