Você está na página 1de 35

Programação Avançada

Prof. Maurício Aldenor

2022
Estudo de Caso
Considere a classe:
public class CarrinhoDeCompras {
private double total;
private Produto[] produtos;
private int contador = 0;

public CarrinhoDeCompras(Produto[] produtos) {


this.produtos = produtos;
}
// outros métodos
}
Estudo de Caso
No momento de criar um objeto da classe CarrinhoDeCompras,
passamos a quantidade de Produtos que poderá ser adicionada:

CarrinhoDeCompras carrinho =
new CarrinhoDeCompras(new Produto[ 10 ]);
Estudo de Caso
• Problemas dessa abordagem:
• Não tem como saber, a priori, se o usuário vai comprar 2, 10 ou
100 produtos;
• O tamanho do array nunca vai mudar. Depois de criado, vai ter a
capacidade fixa e não pode ser redimensionado:
• Seria possível criar uma lógica de criar um vetor maior e fazer
a transferência dos elementos para ele. Mas seria muito
trabalhoso!
Estudo de Caso
• Problemas dessa abordagem:
• A remoção de elementos é um outro problema. Repare como
ficará o array após removermos o elemento de posição 2:

• E agora, como faremos ao adicionar novos itens?


• Uma possibilidade seria criar um outro array, guardando as
posições livres, e consultá-lo antes de inserir um novo Produto;
• Outra possibilidade seria sempre reordenar o array depois de
remover um item.
• Muito trabalhoso...
Para resolver esse tipo de problema
usamos Collections...
Collections
• Estruturas de dados que podem armazenar objetos;
• Mais poderoso que vetores e matrizes;
• Já vem por padrão no JDK (desde a versão 1.2) -> pacote java.util;
• Diversos comportamentos já vem prontos, basta saber usá-los
(pesquisa, documentação do Java);
• Aumenta a produtividade.
Collections

Map Set List Queue

HashMap TreeMa ArrayLi LinkedL Vector


p st ist
Collections
Set:
• Coleção de elementos de um conjunto (matemática);
• Não mantém índice e nem contagem dos elementos;
• Um elemento pertence ou não ao conjunto;
• Não permite elementos duplicados;
• Se precisar ordenar os elementos, usar a classe
SortedSet.
Collections
Stack:
• Coleção para manter uma pilha de elementos;
• Ex: pilha de pratos;
• ORDEM: último que entra é o primeiro que sai;
• Termo em inglês para a ordem “Last-in, First-out” (LIFO);
• As operações de inserção e de remoção são feitas por um
único extremo: pelo topo.
Collections
Queue:
• Coleção para manter uma fila de elementos;
• Ex: fila de banco.
• A ordem dos elementos se dá através da ordem de chegada
do elemento;
• ORDEM: primeiro que entra é o primeiro que sai;
• Termo em inglês para a ordem “First-in, First-out” (FIFO);
• As operações de inserção são feitas por uma extremidade e
as operações de remoção, por outra
Collections
List:
• Coleção indexada de objetos;
• O índice dos elementos seguem o mesmo raciocínio dos
vetores/matrizes;
• É implementada por diversas classes:
• ArrayList
• LinkedList
• Vector
• Fornece diversos métodos prontos para manipulação dos
elementos!
Collections
ArrayList:
Facilidades:
• Adicionar elementos sem precisar redimensionar a lista;
• Acessar elementos baseado no índice;
• Remover determinado elemento;
• Procurar ocorrências de determinado elemento (busca);
• Melhorar a segurança;
• Vários outras...
Collections
ArrayList:
Como instanciar:
List<String> lista = new ArrayList<String>();

ArrayList<String> lista = new ArrayList<String>(); -> Java 5


ArrayList<String> lista = new ArrayList<>(); -> Java 7+

Os tipos podem variar, inclusive


pode ser de classes criadas pelo
programador
Collections
ArrayList:
Principais Métodos:
boolean add (Object element)
Adiciona o elemento especificado no final da lista.
void add (int index, Object element)
Insere o elemento especificado na posição indicada da lista.
void clear ()
Remove todos os elementos da lista, mas mantém sua
estrutura.
Collections
ArrayList:
Principais Métodos:
boolean contains (Object element)
• Retorna verdadeiro se a lista contém o elemento
especificado e falso caso contrário.
Object get (int index)
• Retorna o i-ésimo elemento da lista.
int indexOf (Object element)
• Retorna a posição da primeira ocorrência do elemento
especificado na lista.
Collections
ArrayList:
Principais Métodos:
boolean isEmpty ()
Retorna verdadeiro se a lista estiver vazia e falso caso
contrário.
int lastIndexOf (Object element)
Retorna a posição da última ocorrência do elemento
especificado na lista.
Object remove (int index)
Remove o i-ésimo elemento da lista.
Collections
ArrayList:
Principais Métodos:
Object set (int index, Object element):
Substitui o i-ésimo elemento da lista pelo elemento
especificado.
int size ()
Retorna o número de elementos da lista.
Collections.sort(nomes)
Ordena a lista “nomes”.
Collections
ArrayList:
Percorrendo o ArrayList:
ArrayList<String> lista = new ArrayList<>();
Forma 1:
for ( int i = 0 ; i < lista.size() ; i++ ) {
System.out.println( lista.get( i ) );
}
Forma 2 (simplificada):
for ( String elemento : lista ) {
System.out.println( elemento );
}
Collections
ArrayList:
Percorrendo o ArrayList:
ArrayList<String> lista = new ArrayList<>();
Forma 3 (operação funcional):
lista.stream().forEach((elemento) -> {
System.out.println( elemento );
});
Collections
ArrayList:
Visualizando o conteúdo do ArrayList:
ArrayList<String> lista = new ArrayList<>();
Para visualizar:
System.out.println( lista );
Resultado:
[primeiro, segundo, terceiro]
Collections
ArrayList x LinkedList:
• ArrayList usa array internamente, LinkedList não;
• ArrayList é mais rápida para fazer pesquisar (iterar), enquanto
que LinkedList é mais rápida para inserir e remover elementos
de suas pontas;
• ArrayList usa menos memória que o LinkedList.
Collections
HashMap:
Principais Características:
• Trabalha com conceito de pares de chave-valor (key-
value);
• Cada elemento do HashMap possui uma chave e um valor
respectivo;
• É possível buscar rapidamente pela chave (key) sem
precisar percorrer toda a lista para achar um valor.
Collections
HashMap:
Principais Características (cont.):
• Capacidade inicial (initial size): 16 pares chave-valor;
• Fator de carregamento (load factor), usado para decidir
quando o HashMap deve dobrar de tamanho: 0.75 ou 75%;
• Exemplo: ao criar um HashMap, o mesmo já vem com 16
posições. Ao preencher a 12ª posição (75% preenchido), o
mesmo dobra de tamanho, resultando em 32 posições.
Collections
HashMap:
Como instanciar:
Map<String, String> mapa = new HashMap<String, String>();

HashMap<String, String> mapa = new HashMap<String, String>();


HashMap<String, String> mapa = new HashMap<>();

HashMap<tipoC, tipoV> mapa = new HashMap<tipoC, tipoV>();

Os tipos podem variar, inclusive


pode ser de classes criadas pelo
programador
Collections
HashMap:
Principais Métodos:
boolean put (C chave, V valor)
• Adiciona o elemento especificado no HashMap.
void clear ()
• Remove todos os elementos do HashMap, mas mantém sua
estrutura.
Collections
HashMap:
Principais Métodos:
boolean containsKey (Object key)
Retorna verdadeiro se a lista contém a chave especificada e
falso caso contrário.
boolean containsValue (Object value)
Retorna verdadeiro se a lista contém um ou mais valores
especificados e falso caso contrário.
Collections
HashMap:
Principais Métodos:
boolean isEmpty ()
Retorna verdadeiro se o HashMap estiver vazio e falso caso
contrário.
Object replace (Object key, Object value)
Substitui o valor da chave especificada e retorna o valor substituído
ou null.
Object remove (Object key)
Remove o elemento do HashMap de determinada chave
Collections
HashMap:
Principais Métodos:
Object keySet (Object key):
Retorna um Set com todas as chaves do HashMap. Muito usado
para percorrer o HashMap através de uma estrutura de repetição
(for).
Object get (Object key):
Retorna o valor do HashMap de determinada chave.
int size ()
Retorna o número de elementos do HashMap.
Collections
HashMap:
Percorrendo o HashMap:
HashMap<String, String> mapa = new HashMap<>();
Forma 1 ( usando keySet() ):
for ( String chave : mapa.keySet() ) {
SOUT("c: " + chave + " / v: " + mapa.get(chave));
}
Collections
HashMap:
Percorrendo o HashMap:
HashMap<String, String> mapa = new HashMap<>();
Forma 2 (operação funcional):
mapa.keySet().stream().forEach((chave) -> {
SOUT("c: " + chave + " / v: " + mapa.get(chave));
});
Collections
HashMap:
Visualizando o conteúdo do HashMap:
HashMap<String, String> mapa = new HashMap<>();
Para visualizar:
System.out.println( mapa );
Resultado:
{el1=primeiro, el2=segundo, el3=terceiro}
Collections
• Como escolher a Collection
certa para determinado
problema?
• Baseado em / Traduzido de
http://i.stack.imgur.com/aSDsG.png
• Para ver maior:
https://goo.gl/ds8zLD
Collections - Exercícios
1) Crie um projeto em Java e declare uma Lista do tipo ArrayList
para armazenar o nome dos estados do Brasil (não usar sigla),
sendo que o usuário deverá informá-los através do teclado. Além
disso, o programa não pode permitir que o usuário:
• insira String vazia ("");
• repita o nome dos estados.
A inserção de dados deve parar quando os 26 estados forem
armazenados na lista e, no final, ela deve ser impressa em
ordem alfabética.
OBS: Tratar/lançar as exceções utilizando try-catch.
Collections - Exercícios
2) Crie outro projeto em Java e declare um Map do tipo
HashMap para armazenar a sigla dos estados do Brasil (como
chave) e o respectivo nome (como valor), sendo que o usuário
deverá informar os dados através do teclado. Além disso, o
programa não pode permitir que o usuário:
• insira String vazia ("") na sigla e no estado;
• repita o nome das siglas e dos estados.
A inserção de dados deve parar quando os 26 estados forem
armazenados no mapa e, no final, ele deve ser impresso.
OBS: Tratar/lançar as exceções utilizando try-catch.
Collections – Exercícios (TRABALHO)
3) Crie um novo projeto Java para controlar pedidos de uma
pizzaria. Os pedidos são feitos pelo telefone e o atendente usa um
sistema feito em Java para controlar os pedidos. Programe:
a) A classe Pedido (com pelo menos 3 atributos e seus métodos
get e set, lançando regras de exceção);
b) ArrayList para armazenar os pedidos (pelo menos 5 pedidos
informados pelo usuário do sistema);
c) Perguntar para o usuário se o pedido foi entregue. Caso
afirmativo, então remover o pedido da lista;
d) Mostrar a quantidade de pedidos que ainda estão na lista de
pedidos;
e) Opção para exibir os dados do próximo pedido.

Você também pode gostar