Orientação a Objetos AULA 09 Prof. Fabrício Martins Mendonça
Conteúdo da Aula ü Coleções ü Coleções lista de objetos ü Coleções conjuntos 2
Coleções Podemos armazenar vários objetos em um array e este array será visto como uma única entidade. Um array pode ser encapsulado dentro de uma classe, possibilitando que seja manipulado por métodos da classe. Apesar da flexibilidade de um array em uma classe, algumas características não podem ser implementadas de forma trivial nesta estrutura. 3
Coleções Limitações no uso de um array em Java: O tamanho do array não pode ser modificado depois que o mesmo é criado. Um array pode conter apenas elementos de um mesmo tipo, a não ser que consideremos os recursos de herança e polimorfismo. Algumas operações não podem ser feitas de maneira simples: Inserção ou exclusão de elementos - Devemos deslocar elementos para isto. 4
Coleções Muitas linguagens de programação orientadas a objeto já possuem classes e interfaces para processamento de objetos em conjunto. Conjuntos de objetos são frequentemente chamados de coleções. Classes e interfaces podem ser usadas para manipulação de coleções de objetos onde o uso de arrays poderia não ser viável ou ser complicado. Muitas classes implementam estruturas de dados relativamente complexas, mas de uso transparente para o programador. Exemplos: Listas Encadeadas, Pilhas, Filas, Árvores etc. 5
Coleções Essas classes de estruturas de dados, que representam coleções de objetos, são herdadas da classe Object. No Java, elementos de tipos nativos deverão estar encapsulados em objetos para serem incluídos nas coleções. Algumas classes que manipulam coleções de objetos podem ter funcionalidades (métodos) semelhantes - possuem mesmos nomes mas as implementações são diferentes. Exemplos: Inserir, Excluir etc. Classes de coleções da linguagem Java encontram-se no pacote java.util. 6
São coleções onde elementos repetidos são permitidos. Os elementos de uma lista têm posição definida. Podemos considerar que uma lista é um array com algumas capacidades adicionais. Uma das capacidades de uma lista que a diferencia do array é a possibilidade de alteração de acordo com a necessidade. Para a implementação de listas em Java existe: Uma interface List que declara quais métodos podem ser usados; Duas classes que implementam a interface List. 7
Classes para manipulação de listas em Java: ArrayList: Implementa a lista como um array. LinkedList: Implementa a lista como um array, mas apresenta melhor desempenho para operações de inserção e exclusão de elementos do que a classe ArrayList. As classes ArrayList e LinkedList têm métodos básicos para adicionar e recuperar elementos da lista. 8
Para adicionar elementos ao final da lista usamos o método add. O método add recebe como parâmetro uma instância de qualquer classe. Podemos também definir a posição onde o objeto será inserido na lista. Basta usar o método add que recebe como parâmetros um inteiro (posição) e o objeto a ser inserido na referida posição. Não pode ser definida qualquer posição: As posições de uma lista são identificadas com índices de 0 a N - 1, onde N é o tamanho da lista. 9
Para recuperar elementos da lista usamos o método get que recebe como parâmetro um inteiro correspondente à posição do objeto na lista. Atentar para os valores a serem definidos para a posição ao usar o método get. O método size retorna o número de elementos contidos em uma instância de ArrayList ou LinkedList. 10
As classes ArrayList e LinkedList contêm o método set que recebe dois parâmetros: Um valor inteiro correspondente à posição - entre 0 e N - 1, N = tamanho da lista; Um objeto a ser inserido na posição. O método set substitui o objeto na referida posição e retorna o objeto que ocupava a mesma. 11
As classes ArrayList e LinkedList permitem verificar se um objeto existe na lista através dos métodos contains e indexof. O método contains recebe como parâmetro a instância de uma classe e retorna true ou false dependendo de o objeto estar ou não na lista. O método indexof recebe como argumento uma instância de uma classe e retorna a posição da primeira ocorrência da instância na lista. Caso o objeto não exista na lista, será retornado o valor -1. O método lastindexof procura o objeto a partir do final da lista. As classes ArrayList e LinkedList contêm ainda o método isempty que retorna true ou false se a lista estiver vazia ou não respectivamente. 12
Para remover elementos de uma lista podemos usar o método remove de duas maneiras: Uma que recebe um inteiro correspondente à posição do elemento a ser removido. Uma que recebe um objeto de qualquer classe e remove a primeira ocorrência se houver. Retorna true se remover e false caso contrário. Após a remoção de um elemento da lista os índices dos demais e o tamanho da lista serão ajustados. 13
Exemplo 1: LinkedList public class Teste { public static void main(string[] args) { Aluno maria = new Aluno(); maria.setnome("maria"); Aluno manoel = new Aluno(); manoel.setnome("manoel"); Aluno joaquim = new Aluno(); joaquim.setnome("joaquim"); LinkedList listaligada = new LinkedList(); listaligada.add(maria); listaligada.add(manoel); listaligada.add(1, joaquim); for (int i = 0; i < listaligada.size(); i++) { System.out.println(listaLigada.get(i)); } } } 14
Exemplo 2: fila public class Fila { private List<Object> objetos = new LinkedList<Object>(); public void insere(object objeto) { this.objetos.add(objeto); } public Object remove() { return this.objetos.remove(0); } public boolean vazia() { return this.objetos.size() == 0; } } 15
Exemplo 2 (continuação): fila public class Fila<T> { private List<T> objetos = new LinkedList<T>(); public void insere(t t) { this.objetos.add(t); } public T remove() { return this.objetos.remove(0); } public boolean vazia() { return this.objetos.size() == 0; } } 16
Exemplo 2 (continuação): fila public class Teste { public static void main(string[] args) { Fila<Aluno> fila = new Fila<Aluno>(); Aluno aluno = new Aluno(); fila.insere(aluno); Aluno alunoremovido = fila.remove(); if (fila.vazia()) { System.out.println("A fila está vazia"); } Fila<String> filadestring = new Fila<String>(); filadestring.insere("adelaide"); filadestring.insere("carolina"); String carolina = filadestring.remove(); String adelaide = filadestring.remove(); System.out.println(carolina); System.out.println(adelaide); } } 17
Exemplo 3: interface Queue para Fila public class Teste { public static void main(string[] args) { Queue fila = new LinkedList(); Aluno aluno = new Aluno(); fila.offer(aluno); } } Aluno alunoremovido = (Aluno)fila.poll(); if(fila.isempty()){ System.out.println("A fila está vazia"); } 18
Exemplo 4: pilha public class Pilha<T> { private LinkedList<T> objetos = new LinkedList<T>(); } public void insere(t t) { this.objetos.add(t); } public T remove() { return this.objetos.remove(this.objetos.size() - 1); } public boolean vazia() { return this.objetos.size() == 0; } 19
Exemplo 4 (continuação): pilha public class Teste { public static void main(string[] args) { Pilha<Peca> pilha = new Pilha<Peca>(); Peca peca = new Peca(); pilha.insere(peca); Peca pecaremove = pilha.remove(); if (pilha.vazia()) { System.out.println("A pilha está vazia"); } Pilha<String> pilha2 = new Pilha<String>(); pilha2.insere("adalberto"); pilha2.insere("maria"); String maria = pilha2.remove(); String adalberto = pilha2.remove(); System.out.println(maria); System.out.println(adalberto); } } 20
Exemplo 5: interface Stack para Pilha public class Teste { public static void main(string[] args) { Stack pilha = new Stack(); Peca pecainsere = new Peca(); pilha.push(pecainsere); Peca pecaremove = (Peca)pilha.pop(); if(pilha.isempty()){ System.out.println("A pilha está vazia"); } } } 21
Exercício: Implementar a classe Votação A classe deverá processar os votos de uma eleição sem conhecimento prévio de quem são os candidatos; A cada novo candidato votado, este deverá ser inserido numa lista; A votação será encerrada quando informado o valor -1 para candidato votado; Ao final da votação deverá ser exibido o número total de votos bem como a votação de cada candidato. 22
Diferenças entre ArrayList e LinkedList: Apesar das classes ArrayList e LinkedList implementarem a interface List, LinkedList é mais conveniente do que ArrayList. Em especial para elaborar estruturas de dados como pilhas e filas. O que permite a implementação facilitada de pilhas e filas através da classe LinkedList são os métodos adicionais disponíveis na classe. Evidentemente cada uma tem suas vantagens e desvantagens. De forma geral, a classe ArrayList é mais rápida para operações de pesquisa e a classe LinkedList é mais rápida em operações de inserção e remoção de elementos (principalmente nas pontas). 23
Diferenças entre ArrayList e LinkedList: O que permite a implementação facilitada de pilhas e filas através da classe LinkedList são os métodos adicionais disponíveis na classe. addfirst; addlast; getfirst; getlast; removefirst; removelast; etc; 24
Coleções - Conjuntos Uma alternativa para implementação de Coleções no Java são os conjuntos (set). Os conjuntos são coleções em que não é permitida duplicação de objetos. Alguns exemplos: Uma turma pode ser considerada um conjunto de alunos, os números de uma loteria pode ser considerado um conjunto de inteiros. 25
Coleções - Conjuntos Os conjuntos podem ser vazios. O tamanho de conjuntos pode variar dinamicamente. Os objetos em um conjunto não são mantidos na mesma ordem que foram inseridos. Classes para manipulação de conjuntos em Java implementam a interface Set. HashSet, TreeSet. 26
Coleções - Conjuntos Alguns métodos das classe HashSet e TreeSet: add; remove; contains; isempty Os elementos de um conjunto não têm posições indexadas. Para percorrer os elementos de um conjunto podemos usar a interface Iterator. A classe Iterator cria uma lista de elementos a partir de um objeto que represente uma coleção. Métodos de interesse: hasnext; next; remove. 27
Coleções - Conjuntos Exemplo: 28
Coleções - Conjuntos Exemplo: 29