Coleções Conceitos e Utilização Básica c Professores de ALPRO I Faculdade de Informática PUCRS 05/2012 ALPRO I (FACIN) Coleções: Básico 05/2012 1 / 41
Nota Este material não pode ser reproduzido ou utilizado de forma parcial sem a permissão dos autores. $Id: aula32_arraylist.lyx 94 2009-05-18 20:03:02Z flash $ ALPRO I (FACIN) Coleções: Básico 05/2012 2 / 41
Sumário 1 Coleções Definição Modelando com coleções 2 ArrayList Visão geral Criando uma coleção Adicionando um elemento Acessando um elemento Localizando um elemento Removendo um elemento Utilizando a classe Cadastro 3 Exercícios ALPRO I (FACIN) Coleções: Básico 05/2012 3 / 41
Coleções Coleções Em diversos problemas, é necessário representar uma coleção de objetos. Cadastro: coleção de funcionários. Chamada: coleção de alunos. ALPRO I (FACIN) Coleções: Básico 05/2012 5 / 41
Coleções Definição Coleções Coleção É um objeto capaz de armazenar referências para um grupo de objetos de uma outra classe. Exemplos: Uma chamada armazena referências para vários alunos. Um cadastro armazena referências para vários funcionários. A classe java.util.arraylist implementa coleções, em Java. Consulte a documentação da classe na API Java para conhecer todo os métodos disponíveis. ALPRO I (FACIN) Coleções: Básico 05/2012 6 / 41
Coleções Definição Modelos de coleções no BlueJ As coleções aparecem sempre como dependências entre classes. ALPRO I (FACIN) Coleções: Básico 05/2012 7 / 41
Coleções Modelando com coleções Modelando com coleções Passo ➊: Ao modelar um problema, crie uma classe para representar o grupo de objetos que aparece no problema. Essa classe é denominada classe de controle. Identifique: a classe que representa cada elemento do grupo. as operações realizadas sobre um elemento. a classe que representa o grupo. as operações realizadas sobre o grupo. Um atributo da classe que representa o grupo de objetos é um objeto da classe java.util.arraylist. ALPRO I (FACIN) Coleções: Básico 05/2012 8 / 41
Coleções Modelando com coleções Exemplo: Cadastro de funcionários No problema do cadastro de funcionários: Elemento: Funcionario Operações: aumentar o salário, consultar e alterar nome, CPF, salário... Grupo: Cadastro Operações: admitir ou demitir funcionário, localizar a ficha de um funcionário por nome ou por CPF,... ALPRO I (FACIN) Coleções: Básico 05/2012 9 / 41
Coleções Modelando com coleções Modelando com coleções Passo ➋: Localize na classe ArrayList quais os métodos que podem auxiliar a programar a classe que representa o grupo. Há métodos para inserir e remover elementos. Há uma forma de conhecer o tamanho da coleção, isto é, quanto elementos existem nela. Finalmente, há uma maneira de obter uma referência para qualquer um dos elementos armazenados. ALPRO I (FACIN) Coleções: Básico 05/2012 10 / 41
Coleções Modelando com coleções Exemplo: Cadastro de funcionários (cont.) No problema do cadastro de funcionários, considerando a classe Cadastro (grupo): Admitir funcionário: Método auxiliar: inserir elemento na coleção. Demitir funcionário: Método auxiliar: remover elemento da coleção. Localizar o funcionário por nome ou CPF: Métodos auxiliares: obter um elemento qualquer e obter o tamanho da coleção, junto com uma repetição while. ALPRO I (FACIN) Coleções: Básico 05/2012 11 / 41
ArrayList Visão geral ArrayList: visão geral Os principais métodos da classe ArrayList são: Método ArrayList<E>() boolean add(e elem) boolean remove(e elem) int size() E get(int pos) Descrição Cria uma coleção vazia de objetos da classe E Insere um elemento no final da coleção Remove um elemento da coleção Retorna o tamanho da coleção Retorna o elemento na posição pos Veja todos os métodos em: http://docs.oracle.com/javase/6/docs/api/java/util/arraylist.html ALPRO I (FACIN) Coleções: Básico 05/2012 13 / 41
ArrayList Criando uma coleção Criando uma coleção Importação de pacote Para utilizar a classe ArrayList é necessário importar o pacote que a contém: import java. util. ArrayList ; Dessa forma, no programa agora é possível se referir a ela simplesmente como ArrayList. ALPRO I (FACIN) Coleções: Básico 05/2012 14 / 41
ArrayList Criando uma coleção Criando uma coleção O método construtor Método ArrayList<E>() Descrição Cria uma coleção vazia de objetos da classe E Um ArrayList armazena referências para objetos da classe E. A lista inicia com capacidade para armazenar dez referências. Essa capacidade inicial pode ser alterada se necessário. Exemplos: // Coleção de referências para a classe Funcionario. cadastro = new ArrayList<Funcionario > ( ) ; // Coleção de referências para a classe Aluno. chamada = new ArrayList<Aluno > ( ) ; ALPRO I (FACIN) Coleções: Básico 05/2012 15 / 41
ArrayList Criando uma coleção Criando uma coleção A classe de controle da coleção Contém um atributo do tipo ArrayList. O construtor deve instanciar o ArrayList. Exemplo: cadastro de funcionários. import java. util. ArrayList ; public class Cadastro { private ArrayList<Funcionario> lista ; public Cadastro ( ) { lista = new ArrayList<Funcionario > ( ) ; ALPRO I (FACIN) Coleções: Básico 05/2012 16 / 41
ArrayList Criando uma coleção Inspecionando a coleção via BlueJ ALPRO I (FACIN) Coleções: Básico 05/2012 17 / 41
ArrayList Adicionando um elemento Adicionando um elemento na coleção O método add Método Descrição public boolean add(e elem) Insere um elemento no final da coleção Insere a referência para o objeto elem no final da coleção. Se não houver mais posições livres, a lista é ampliada automaticamente. lista 0 1 2 3 4 func1 func2 func3 ALPRO I (FACIN) Coleções: Básico 05/2012 18 / 41
ArrayList Adicionando um elemento Adicionando um elemento na coleção Utilizando o método add na classe Cadastro Na classe Cadastro, adicionar um elemento corresponde à admissão de um novo funcionário: public class Cadastro { public boolean admitir ( Funcionario f ) { return lista. add ( f ) ; O método é boolean, pois utilizamos o retorno do método add diretamente. ALPRO I (FACIN) Coleções: Básico 05/2012 19 / 41
ArrayList Acessando um elemento Acessando um elemento da coleção O método get Método E get(int pos) Descrição Retorna o elemento na posição pos A primeira posição é a 0. Ex: na lista abaixo, a chamada para get(1) retornará a referência para func2. lista 0 1 2 3 4 func1 func2 func3 ALPRO I (FACIN) Coleções: Básico 05/2012 20 / 41
ArrayList Acessando um elemento Acessando um elemento da coleção Descobrindo o tamanho da coleção: o método size Método int size() Descrição Retorna o tamanho da coleção É fundamental conhecer a quantidade de referências armazenadas na lista. A maioria dos algoritmos baseia-se em repetição para percorrer a lista. Por exemplo, faremos um método para procurar um funcionário através do seu CPF. Se encontrar o funcionário, retorna a referência para o objeto. Se não encontrar, retorna null. ALPRO I (FACIN) Coleções: Básico 05/2012 21 / 41
ArrayList Localizando um elemento Localizando um elemento da coleção Utilizando os métodos get e size na classe Cadastro public class Cadastro { public Funcionario pesquisarcpf ( String cpf ) { Funcionario f = null ; int pos = 0; while ( pos < lista. size ( ) ) { f = lista. get ( pos ) ; if ( f. getcpf ( ). equals ( cpf ) ) return f ; pos++; return null ; ALPRO I (FACIN) Coleções: Básico 05/2012 22 / 41
ArrayList Localizando um elemento Localizando um elemento da coleção A execução do método pesquisacpf public class Cadastro { private ArrayList<Funcionario> lista ; public Cadastro ( ) { lista = new ArrayList<Funcionario > ( ) ; lista 0 1 2 3 4 public Funcionario pesquisarcpf ( String cpf ) { Funcionario f = null ; int pos = 0; while (pos < lista.size()) { f = lista.get(pos); if ( f. getcpf ( ). equals ( cpf ) ) return f ; pos++; return null ; func1 func2 func3 f ALPRO I (FACIN) Coleções: Básico 05/2012 23 / 41
ArrayList Localizando um elemento Localizando um elemento da coleção A execução do método pesquisacpf public class Cadastro { private ArrayList<Funcionario> lista ; public Funcionario ( ) { lista = new ArrayList<Funcionario > ( ) ; lista 0 1 2 3 4 public Funcionario pesquisarcpf ( String cpf ) { Funcionario f = null ; int pos = 0; while (pos < lista.size()) { f = lista.get(pos); if ( f. getcpf ( ). equals ( cpf ) ) return f ; pos++; return null ; func1 func2 func3 f ALPRO I (FACIN) Coleções: Básico 05/2012 24 / 41
ArrayList Localizando um elemento Localizando um elemento da coleção A execução do método pesquisacpf public class Cadastro { private ArrayList<Funcionario> lista ; public Funcionario ( ) { lista = new ArrayList<Funcionario > ( ) ; lista 0 1 2 3 4 public Funcionario pesquisarcpf ( String cpf ) { Funcionario f = null ; int pos = 0; while (pos < lista. size ( ) ) { f = lista. get (pos ) ; if ( f. getcpf ( ). equals ( cpf ) ) return f; pos++; return null ; func1 func2 func3 f ALPRO I (FACIN) Coleções: Básico 05/2012 25 / 41
ArrayList Removendo um elemento Removendo um elemento da coleção O método remove Método boolean remove (E elem) Descrição Remove um elemento da coleção Procura a referência para elem na lista. Se encontrar, remove a referência da lista e retorna true. Se não encontrar, retorna false. Na classe Cadastro, podemos utilizá-lo em um método para demitir funcionários. Mais uma vez, utilizaremos diretamente o valor de retorno do método remove. ALPRO I (FACIN) Coleções: Básico 05/2012 26 / 41
ArrayList Removendo um elemento Removendo um elemento da coleção Utilizando o método remove na classe Cadastro public class Cadastro { public boolean demitir ( Funcionario f ) { return lista. remove ( f ) ; Exemplo de utilização: public class AppCadastro { public void executa ( ) { Cadastro cad = new Cadastro ( ) ; boolean result ; Funcionario f = cad. pesquisarcpf ( "123456789-00" ) ; if ( f!= null ) { result = cad. demitir ( f ) ; ALPRO I (FACIN) Coleções: Básico 05/2012 27 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro O programa AppCadastro public class AppCadastro { public void executa ( ) { Cadastro cadastro = new Cadastro ( ) ; Funcionario f ; f = new Funcionario ( "Pedro", "123456789-12" ) ; cadastro. admitir ( f ) ; f = new Funcionario ( "Joana", "234567890-34" ) ; cadastro. admitir ( f ) ; f = new Funcionario ( "Carlos", "633566225-87" ) ; cadastro. admitir ( f ) ; // Procurando por Joana f = cadastro. pesquisarcpf ( "234567890-34" ) ; // Demitindo Joana if ( f!= null ) { boolean result = cadastro. demitir ( f ) ; Analisaremos agora o seu funcionamento. ALPRO I (FACIN) Coleções: Básico 05/2012 28 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro Criando o objeto cadastro cadastro 0 1 2 3 4 public void executa ( ) { Cadastro cadastro = new Cadastro ( ) ; ALPRO I (FACIN) Coleções: Básico 05/2012 29 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro Admitindo o funcionário Pedro cadastro 0 1 2 3 4 Pedro f public void executa ( ) { Funcionario f ; f = new Funcionario ( "Pedro", "123456789-12" ) ; cadastro. admitir ( f ) ; ALPRO I (FACIN) Coleções: Básico 05/2012 30 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro Admitindo a funcionária Joana cadastro 0 1 2 3 4 Pedro Joana public void executa ( ) { f = new Funcionario ( "Joana", "234567890-34" ) ; cadastro. admitir ( f ) ; f ALPRO I (FACIN) Coleções: Básico 05/2012 31 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro Admitindo o funcionário Carlos cadastro 0 1 2 3 4 Pedro Joana Carlos public void executa ( ) { f = new Funcionario ( "Carlos", "633566225-87" ) ; cadastro. admitir ( f ) ; f ALPRO I (FACIN) Coleções: Básico 05/2012 32 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro Procurando pela funcionária Joana cadastro 0 1 2 3 4 Pedro Joana Carlos public void executa ( ) { // Procurando por Joana f = cadastro. pesquisarcpf ( "234567890-34" ) ; f ALPRO I (FACIN) Coleções: Básico 05/2012 33 / 41
ArrayList Utilizando a classe Cadastro Utilizando a classe Cadastro Demitindo a funcionária Joana cadastro 0 1 2 3 4 Pedro Carlos f public void executa ( ) { // Demitindo Joana if ( f!= null ) { boolean result = cadastro. demitir ( f ) ; ALPRO I (FACIN) Coleções: Básico 05/2012 34 / 41
Exercícios Exercício ➊ Identifique as operações da classe Chamada, que armazena um grupo de alunos. Identifique os métodos de ArrayList que podem auxiliar na implementação de cada operação. ALPRO I (FACIN) Coleções: Básico 05/2012 36 / 41
Exercícios Exercício ➋ Escreva a classe Chamada: Inscrever aluno. Cancelar inscrição de aluno. Localizar aluno por matrícula. Localizar aluno por nome. Localizar aluno por parte do nome. Dica: explore os métodos da classe String. Ex: use o método equals para comparar duas strings. ALPRO I (FACIN) Coleções: Básico 05/2012 37 / 41
Exercícios Exercício ➌ Considerando o exemplo do cadastro de funcionários: Classe Funcionario: Acrescente um atributo para armazenar o salário. Altere as demais classes de acordo com o que segue. Classe Cadastro: Acrescente um método que calcule e retorne o total da folha de pagamento da empresa. Acrescente um método que retorne a referência para o funcionário com maior salário. Acrescente um método que calcule e retorne a média dos salários. Implemente um método tostring que retorne uma string com os dados de todos os funcionários armazenados, bem como a média dos salários. ALPRO I (FACIN) Coleções: Básico 05/2012 38 / 41
Exercícios Exercício ➍ Considere que um cliente pode ter uma única conta bancária. Um banco tem diversas contas. Uma conta bancária pode ter apenas um cliente associado. Desenhe as classes e dependências. Identifique as coleções e referências. ALPRO I (FACIN) Coleções: Básico 05/2012 39 / 41
Exercícios Exercício ➎ Crie um programa para controlar bilhetes de estacionamento. O bilhete é emitido quando o carro ingressa no estacionamento. Ele deve conter a placa do veículo, a data e o horário de entrada. Quando o veículo sair do estacionamento, serão anotados no bilhete também a data e horário de saída e o total a pagar pela permanência do veículo. Para cada hora de permanência do veículo é cobrado R$ 2,00. O estacionamento possui apenas 17 vagas. Sugestão: crie classes para representar data e horário. ALPRO I (FACIN) Coleções: Básico 05/2012 40 / 41
Exercícios Leitura recomendada HORSTMANN, Cay. Big Java, Capítulo 13. Porto Alegre: Bookman, 2004. p. 496-503. ALPRO I (FACIN) Coleções: Básico 05/2012 41 / 41