13 Generics Set Map
13 Generics Set Map
Programação Orientada a
Objetos com Java
Capítulo: Generics, Set, Map
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Introdução aos Generics
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Generics
• Generics permitem que classes, interfaces e métodos possam ser
parametrizados por tipo. Seus benefícios são:
• Reuso
• Type safety
• Performance
https://github.com/acenelio/generics1-java
Genéricos delimitados
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema
Uma empresa de consultoria deseja avaliar a performance de produtos,
funcionários, dentre outras coisas. Um dos cálculos que ela precisa é encontrar
o maior dentre um conjunto de elementos. Fazer um programa que leia um
conjunto de produtos a partir de um arquivo, conforme exemplo, e depois
mostre o mais caro deles.
Criar um serviço de cálculo:
Computer,890.50
IPhone X,910.00
Tablet,550.00
Most expensive:
IPhone, 910.00
Nota: Java possui:
https://github.com/acenelio/generics2-java Collections.max(list)
package services;
import java.util.List;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.List;
O compilador não sabe qual é o tipo específico do qual a lista foi instanciada.
Curingas delimitados (bounded
wildcards)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema 1
Vamos fazer um método para retornar a soma das áreas de uma lista de
figuras.
https://github.com/acenelio/generics4-java
Problema 2 (princípio get/put)
Vamos fazer um método que copia os elementos de uma lista para uma
outra lista que pode ser mais genérica que a primeira.
copy(myInts, myObjs);
copy(myDoubles, myObjs);
https://stackoverflow.com/questions/1368166/what-is-a-difference-between-super-e-and-extends-e
Java wrapper types (próximos exemplos)
Princípio get/put - covariância
List<Integer> intList = new ArrayList<Integer>();
intList.add(10);
intList.add(5);
Number x = list.get(0);
get - OK
put - ERROR
Princípio get/put - contravariância
List<Object> myObjs = new ArrayList<Object>();
myObjs.add("Maria");
myObjs.add("Alex");
myNums.add(10);
myNums.add(3.14);
get - ERROR
put - OK
package application;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
copy(myInts, myObjs);
printList(myObjs);
copy(myDoubles, myObjs);
printList(myObjs);
}
public static void copy(List<? extends Number> source, List<? super Number> destiny) {
for(Number number : source) {
destiny.add(number);
}
}
String a = "Maria";
String b = "Alex";
System.out.println(a.equals(b));
HashCode
Método que retorna um número inteiro representando um código gerado
a partir das informações do objeto
String a = "Maria";
String b = "Alex";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
Regra de ouro do HashCode
• Se o hashCode de dois objetos for diferente, então os dois objetos são
diferentes
• https://docs.oracle.com/javase/10/docs/api/java/util/Set.html
Alguns métodos importantes
• add(obj), remove(obj), contains(obj)
• Baseado em equals e hashCode
• Se equals e hashCode não existir, é usada comparação de ponteiros
• clear()
• size()
• removeIf(predicate)
import java.util.HashSet;
import java.util.Set;
import Entities.Product;
set.add("TV");
set.add("Notebook");
set.add("Tablet");
System.out.println(set.contains("Notebook"));
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
//union
Set<Integer> c = new TreeSet<>(a);
c.addAll(b);
System.out.println(c);
//intersection
Set<Integer> d = new TreeSet<>(a);
d.retainAll(b);
System.out.println(d);
//difference
Set<Integer> e = new TreeSet<>(a);
e.removeAll(b);
System.out.println(e);
}
}
Como Set testa igualdade?
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Como as coleções Hash testam igualdade?
• Se hashCode e equals estiverem implementados:
• Primeiro hashCode. Se der igual, usa equals para confirmar.
import java.util.HashSet;
import java.util.Set;
import Entities.Product;
System.out.println(set.contains(prod));
}
}
package entities;
import java.util.Set;
import java.util.TreeSet;
import Entities.Product;
@Override
public String toString() {
return "Product [name=" + name + ", price=" + price + "]";
}
@Override
public int compareTo(Product other) {
return name.toUpperCase().compareTo(other.getName().toUpperCase());
}
}
Exercício resolvido (Set)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Problema exemplo
Um site de internet registra um log de acessos dos usuários. Um
registro de log consiste no nome de usuário (apenas uma palavra) e o
instante em que o usuário acessou o site no padrão ISO 8601,
separados por espaço, conforme exemplo. Fazer um programa que leia
o log de acessos a partir de um arquivo, e daí informe quantos usuários
distintos acessaram o site.
Example
input file:
amanda 2018-08-26T20:45:08Z
alex86 2018-08-26T21:49:37Z
bobbrown 2018-08-27T03:19:13Z
amanda 2018-08-27T08:11:00Z
jeniffer3 2018-08-27T09:19:24Z
alex86 2018-08-27T22:39:52Z
amanda 2018-08-28T07:42:19Z
Execution:
Enter file full path: c:\temp\in.txt
Total users: 4
https://github.com/acenelio/set1-java
Exercício proposto (Set)
http://educandoweb.com.br
Prof. Dr. Nelio Alves
Em um portal de cursos online, cada usuário possui um código único, representado por
um número inteiro.
Cada instrutor do portal pode ter vários cursos, sendo que um mesmo aluno pode se
matricular em quantos cursos quiser. Assim, o número total de alunos de um instrutor não
é simplesmente a soma dos alunos de todos os cursos que ele possui, pois pode haver
alunos repetidos em mais de um curso.
O instrutor Alex possui três cursos A, B e C, e deseja saber seu número total de alunos.
Seu programa deve ler os alunos dos cursos A, B e C do instrutor Alex, depois mostrar a
quantidade total e alunos dele, conforme exemplo.
https://github.com/acenelio/set2-java
Example:
• Principais implementações:
• HashMap - mais rápido (operações O(1) em tabela hash) e não ordenado
• TreeMap - mais lento (operações O(log(n)) em árvore rubro-negra) e ordenado pelo
compareTo do objeto (ou Comparator)
• LinkedHashMap - velocidade intermediária e elementos na ordem em que são adicionados
Alguns métodos importantes
• put(key, value), remove(key), containsKey(key), get(key)
• Baseado em equals e hashCode
• Se equals e hashCode não existir, é usada comparação de ponteiros
• clear()
• size()
import java.util.Map;
import java.util.TreeMap;
cookies.put("username", "maria");
cookies.put("email", "[email protected]");
cookies.put("phone", "99771122");
cookies.remove("email");
cookies.put("phone", "99771133");
System.out.println("ALL COOKIES:");
for (String key : cookies.keySet()) {
System.out.println(key + ": " + cookies.get(key));
}
}
}
Demo 2
package application;
import java.util.HashMap;
import java.util.Map;
import Entities.Product;
stock.put(p1, 10000.0);
stock.put(p2, 20000.0);
stock.put(p3, 15000.0);
Execution:
Enter file full path: c:\temp\in.txt
Alex Blue: 76
Maria Green: 71
Bob Brown: 61
Solução do exercício
https://github.com/acenelio/map1-java