Buscar

Java Collection Framework

Prévia do material em texto

2019.2
PROGRAMAÇÃO II
CCT0695
Aula 3
PROFESSORES:	 HENRIQUE TAVARES
 	 EDIBERTO MARIANO
*
2019.2
MODELO
COMPORTAMENTAL
*
2019.2
*
Java Collection Framework
(Coleções)
Coleção:
 estrutura de
dados
 Vários objetos
 Objeto de agregação
A fundação do framework de coleções do Java
Declaração de uma coleção
Collection<String> colecao = new ArrayList();
2019.2
*
Java Collection Framework
(Coleções)
 API Collections 
Interfaces
Manipulação independente dos detalhes da sua representação.
 Interfaces 
 Collection 
 Implementações 
 Algoritmos 
2019.2
*
Java Collection Framework
(Coleções)
API Collections - Collection
 raiz da hierarquia de coleções
 interface base para todas as coleções
 manipular coleções com máxima generalidade
 Define operações como:
 adição (add),
 remoção (remove);
 esvaziamento (clear);
 tamanho (size);
 conversão para array
 (toArray);
 iterador (iterator);
 verificações de existência
 (contains e isEmpty).
2019.2
*
Java Collection Framework
(Coleções)
Há ainda classes que implementam a interface Map ao invés da Collection,
mesmo assim, faz parte da API Collection.
API Collections - Implementações
concretas das coleções
estruturas de dados reutilizáveis.
são 
2019.2
*
Java Collection Framework
(Coleções)
API Collections - Algoritmos
Métodos
(Busca e Ordenação)
Implementar
Interfaces das
coleções
Algoritmo shuffle
Os algoritmos reverse, fill, copy, max, min
Algoritmo binarySearch
Algoritmos addAll, frequency, disjoint
2019.2
*
Java Collection Framework
(Coleções)
Set
<<interface>>
Set
HashSet
LinkedHashSet
TreeSet
<<interface>>
SortedSet
<<interface>>
Collection
Pesquisa de dados + rápida do que obj tipo List
inserção de dados é mais lenta
Não precisa especificar a posição para adicionar
um elemento
conjuntos e pode ser implementado como
instâncias das classes:
 HashSet ou TreeSet;
Não aceita valores duplicados
Os elementos não são ordenados, nem se
mantém na ordem em que foram inseridos
Set<String> colecaoSet = new HashSet <String> ();
colecaoSet.add("Ediberto Mariano");
colecaoSet.add("Marta Rocha");
colecaoSet.add("Karla Danielle");
Sintaxe
2019.2
*
Java Collection Framework
(Coleções)
Set - Exemplo
package control; 
import java.util.HashSet;
import java.util.Set; 
public class TestandoSet {
 public static void main(String[] args) {
 Set<String> colecaoSet = new HashSet<String>();
 colecaoSet.add("Ediberto Mariano");
 colecaoSet.add("Marta Rocha");
 colecaoSet.add("Karla Danielle");
 //dados duplicados não são inseridos no Set
 colecaoSet.add("Karla Danielle");
 colecaoSet.add("Ediberto Mariano");
 System.out.println("Tamanho coleção Set: "+colecaoSet.size());
 int count = 0;
 for(String valor : colecaoSet){
 System.out.println(++count + " -> " + valor);
 }
 }
}
2019.2
*
Java Collection Framework
(Coleções)
List
<<interface>>
List
ArrayList
Vector
LinkedList
<<interface>>
Collection
Ordenada (sequência)
Elementos duplicados
Índice numérico
É como um array de tamanho variável
Métodos de inserção e remoção
Collection<String> nomes = new ArrayList();
nomes.add("Francisco Silva");
nomes.add("Marta Silva");
nomes.add("Ediberto Mariano");
nomes.add("Marta Silva");
nomes.add("Ediberto Mariano");
Sintaxe
2019.2
*
Java Collection Framework
(Coleções)
List - Exemplo
package package model;
import java.util.Collection; 
import java.util.ArrayList;
public class ColectionList {
 public static void main(String[] args) { 
 Collection<String> nomes = new ArrayList();
 nomes.add("Francisco Silva");
 nomes.add("Marta Silva");
 nomes.add("Ediberto Mariano");
 nomes.add("Marta Silva");
 nomes.add("Ediberto Mariano");
 System.out.println("Lista de nomes: "+nomes);
 }
}
2019.2
*
Java Collection Framework
(Coleções)
Queue (Fila)
<<interface>>
Queue
PriorityQueue
LinkedList
<<interface>>
Collection
Operações: (Além das herdadas de Collection)
 inserção (offer);
 remoção (remove, pool);
 inspeção (peek: para retornar o <head> da fila).
forma de visualizar uma List, acesso às operações
de “enfileirar” e “desenfileirar” alguma coisa.
2019.2
*
Java Collection Framework
(Coleções)
Queue (Fila) - Exemplo
package model;
import java.util.LinkedList;
import java.util.Queue;
public class QueueL {
 public static void main(String[] args) {
 Queue<String> objQueue = new LinkedList<>();
 // ADICIONANDO ELEMENTOS NA LISTA
 objQueue.add("EDIBERTO");
 objQueue.add("KARLA");
 objQueue.add("PEDRO");
 System.out.println("ELEMENTOS DA LISTA " + objQueue);
 System.out.println("Exibindo o Elemento frontal = " + objQueue.peek());
 System.out.println("REMOVENDO o Elemento frontal");
 String nome = objQueue.remove(); //REMOVE O PRIMEIRO ELEMENTO DA LISTA
 }
}
2019.2
*
Java Collection Framework
(Coleções)
Map
Não pode conter chaves duplicadas (= Set)
Os valores podem ser repetidos para chaves diferentes.
Cada chave mapeia para no máximo um valor.
não possui uma ordem definida para percorrimento.
Map<E> mapa = new Type();
Onde:
E - é o objeto declarado, podendo ser classes Wrappers ou tipo de coleção.
Type - é o tipo de objeto da coleção a ser usado.
Sintaxe
2019.2
*
Java Collection Framework
(Coleções)
Ordenação de Objetos (I)
ELEMENTOS (tipo)
ORDEM
String
alfabética
Date
cronológica
ArrayList<String> obj = new ArrayList<String>(); 
obj.add("Ediberto Mariano"); 
obj.add("Armando"); 
obj.add("Izabel"); 
obj.add("Beatriz"); 
obj.add("Antonio Silva"); 
Sintaxe
Collections.sort(obj);
ordem crescente
Collections.sort(obj, Collections.reverseOrder()); 
ordem decrescente
2019.2
*
Java Collection Framework
(Coleções)
Ordenação de Objetos (II)
Automaticamente
Ordenação natural dos objetos de seu tipo
2019.2
*
Java Collection Framework
(Coleções)
Escrevendo tipos comparáveis
public interface Comparable<T>{
public int comparableTo(T o);
}
	
Estrutura
possíveis retornos
inteiro negativo: se objeto recebido como parâmetro < objeto atual;
compareTo()
zero: se o objeto recebido como parâmetro = objeto atual;
inteiro positivo: se recebido como parâmetro > objeto atual
Se objeto atual não puder ser comparado com o objeto passado como parâmetro, o método lança uma exceção.
A classe que implementar a interface Comparable precisa implementar o método compareTo( ).
2019.2
*
Java Collection Framework
(Coleções)
Ordenando tipos comparáveis - Exemplo
//Criar a classe Aluno
package control;
public class Aluno {
 int matricula; 
 String nome, cidade; 
 // MÉTODO CONSTRUTOR
 public Aluno(int matricula, String nome, String cidade) 
 { 
 this.matricula = matricula; 
 this.nome = nome; 
 this.cidade = cidade; 
 } 
 public String toString() 
 { 
 return this.matricula + " " + this.nome + " " + this.cidade; 
 } 
}
2019.2
*
Java Collection Framework
(Coleções)
//Criar a interface InterfaceOrdena
package control;
import java.util.Comparator;
 
public class InterfaceOrdena implements Comparator<Aluno> 
{ 
 // ORDENA POR MATRICULA DO ALUNO EM ORDEM CRESCENTE 
 public int compare(Aluno a, Aluno b) 
 { 
 return a.matricula - b.matricula; 
 } 
}
Ordenando tipos comparáveis - Exemplo
2019.2
*
Java Collection Framework
(Coleções)
//Criar a classe TestaCliente
package model; import control.Aluno; import control.InterfaceOrdena;import java.util.ArrayList; import java.util.Collections;
public class TestaCliente {
 public static void main (String[] args) { 
 ArrayList<Aluno> alu = new ArrayList<Aluno>(); 
 alu.add(new Aluno(1172, "Ediberto Mariano", "Rio de Janeiro")); 
 alu.add(new Aluno(1171, "Pedro Victor", "São Paulo")); 
 alu.add(new Aluno(1173, "Marta", "Belo Horizonte")); 
 alu.add(new Aluno(1170, "Karla Martins", "Niteroi")); 
 System.out.println("LISTA NÃO ORDENADA"); 
 for (int i=0; i<alu.size(); i++) 
 System.out.println(alu.get(i)); 
 Collections.sort(alu, new InterfaceOrdena()); 
 System.out.println("\nLISTA ORDENADA POR MATRICULA DO 
 ALUNO EM ORDEM CRESCENTE "); 
 for (int i=0; i<alu.size(); i++) 
 System.out.println(alu.get(i)); 
 } 
}
Ordenando tipos comparáveis - Exemplo
2019.2
*
Java Collection Framework
(Coleções)
Ordenação não natural (I)
objetos que não implementam Comparable?
objetos de uma forma diferente da sua ordenação natural?
Comparator
(Objetos que implementam esta interface encapsulam uma ordenação)
public interface Comparator<T>{
			int compare(T o1, T o2);
}
	
Estrutura
2019.2
*
Java Collection Framework
(Coleções)
Ordenação não natural (II)
compare()
seus dois argumentos
retorna
inteiro negativo: se o primeiro objeto < segundo objeto
inteiro positivo: se o primeiro objeto > segundo objeto
zero: se o primeiro objeto = segundo objeto
Se algum dos objetos for de um tipo inapropriado para
	 o Comparator, o método lança uma exceção
2019.2
*
Java Collection Framework
(Coleções)
Ordenação não natural (II) - Exemplo
//Criar a classe Aluno
package control;
public class Aluno {
 int matricula; String nome, cidade; 
 public Aluno(int matricula, String nome, String cidade) 
 { this.matricula = matricula; 
 this.nome = nome; 
 this.cidade = cidade; 
 } 
 public Integer getMatricula() {
		return matricula;
 }
 public void setMatricula(Integer matricula) {
		this.matricula = matricula;
 }
 public String toString() 
 { 
 return this.matricula + " " + this.nome + " " + this.cidade; 
 } 
}
2019.2
*
Java Collection Framework
(Coleções)
Ordenação não natural (II) - Exemplo
//Criar a interface InterfaceOrdena
package control;
import java.util.Comparator;
 
public class InterfaceOrdena implements Comparator<Aluno> 
{ 
 // ORDENA POR MATRICULA DO ALUNO EM ORDEM CRESCENTE 
 public int compare(Aluno a, Aluno b) 
 { 
 return a.matricula - b.matricula; 
 } 
}
2019.2
*
Java Collection Framework
(Coleções)
Ordenação não natural (II) - Exemplo
//Criar a classe TestaCliente
package model; import control.Aluno;
import control.InterfaceOrdena; import java.util.ArrayList;
import java.util.Collections;
public class TestaCliente {
 public static void main (String[] args) 
 { ArrayList<Aluno> alu = new ArrayList<Aluno>(); 
 alu.add(new Aluno(1172, "Ediberto Mariano", "Rio de Janeiro")); 
 alu.add(new Aluno(1171, "Pedro Victor", "São Paulo")); 
 alu.add(new Aluno(1173, "Marta", "Belo Horizonte")); 
 alu.add(new Aluno(1170, "Karla Martins", "Niteroi")); 
 System.out.println("LISTA NÃO ORDENADA"); 
 for (int i=0; i<alu.size(); i++) 
 System.out.println(alu.get(i)); 
 Collections.sort(alu, new InterfaceOrdena()); 
 System.out.println("\nOrdenação não natural"); 
 System.out.println("\nLISTA ORDENADA POR MATRICULA DO ALUNO EM ORDEM CRESCENTE "); 
 for (int i=0; i<alu.size(); i++) 
 System.out.println(alu.get(i)); 
 } 
} 
2019.2
*
Java Collection Framework
(Coleções)
SortedSet
elementos ordenados
 em ordem ascendente.
Conjunto mantém
ordem natural ou de acordo com um Comparator
 fornecido na criação do SortedSet
Além das operações normais de um Set, disponibiliza operações para:
		Intervalo (subconjuntos);
		Pontos extremos;
		Acesso ao Comparator.
Não precisa especificar a posição para adicionar
um elemento
Não aceita valores duplicados
Os elementos não são ordenados, nem se
mantém na ordem em que foram inseridos
Set
Sintaxe:
SortedSet set = new TreeSet();
2019.2
*
Java Collection Framework (Coleções)
Ordenação SortedSet - Exemplo
package model;
import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet;
public class OrdenaSet {
 public static void main(String[] args) {
 SortedSet set = new TreeSet();
 set.add("MELANCIA"); set.add("TANGERINA"); set.add("ABACATE"); set.add("CAJÚ");
 Iterator iterator = set.iterator();
 System.out.println("ORDENAÇÃO E MANIPULAÇÃO DE COLEÇÃO SortedSet");
 System.out.println("PROFESSOR: EDIBERTO MARIANO\n");
 System.out.println("EXIBIR TODOS OS ELEMENTOS EM ORDEM CRESCENTE"); 
 while(iterator.hasNext()){
 System.out.print(iterator.next().toString()+" ");
 }
 System.out.println("\n\nEXIBIR O SUBSET DE ABACATE ATÉ O ELEMENTO ANTES DE TANGERINA");
 System.out.println(set.subSet("ABACATE","TANGERINA"));
 System.out.println("EXIBIR TODOS OS ELEMENTOS A PARTIR DO ELEMENTO - CAJÚ");
 System.out.println(set.tailSet("CAJÚ"));
 System.out.println("EXIBIR TODOS ELEMENTOS ATÉ A POSIÇÃO - 1 DO ELEMENTO CAJÚ");
 System.out.println(set.headSet("CAJÚ"));
 System.out.println("\nEXIBIR O PRIMEIRO ELEMENTO DO SET");
 System.out.println(set.first());
 System.out.println("\nEXIBIR O ULTIMO ELEMENTO DO SET");
 System.out.println(set.last());
 }
}
2019.2
*
Java Collection Framework
(Coleções)
Ordenação SortedSet – SAÍDA
2019.2
*
Java Collection Framework
(Coleções)
SortedMap
Mantém chaves Ordenadas
Ascendentemente
ordenação natural
ou de acordo com um Comparator
 fornecido no momento de sua criação
A interface do SortedMap é análoga à interface do
 SortedSet.
Sintaxe:
SortedMap<Integer, String> map = new TreeMap<Integer, String>();
2019.2
*
Java Collection Framework
(Coleções)
SortedMap - Métodos
subMap (K deKey, K toKey): Retorna uma visualização da parte deste Mapa cujas chaves
variam de fromKey, inclusive, a toKey, exclusivo.
headMap (K toKey): Retorna uma vista da parte deste Mapa cujas chaves são estritamente
menores que toKey.
tailMap (K fromKey): Retorna uma visualização da parte deste Mapa cujas chaves são maiores
ou iguais a fromKey.
firstKey(): Retorna a primeira chave (mais baixa) atualmente neste mapa.
lastKey(): Retorna a última chave (mais alta) atualmente neste mapa.
comparator(): Retorna o Comparador usado para ordenar as chaves neste Mapa, ou null se
este Mapa usa a ordenação natural de suas chaves.
values ​​(): Retorna uma visualização Collection dos valores contidos neste mapa.
keySet (): Retorna uma visualização Set das chaves contidas neste mapa.
entrySet (): Retorna uma visualização Set dos mapeamentos contidos neste mapa.
2019.2
*
Java Collection Framework
(Coleções)
SortedMap - Exemplo
package model;
import java.util.Iterator; import java.util.Map; import java.util.Set; 
import java.util.SortedMap; import java.util.TreeMap; 
public class OrdenaMap {
 public static void main(String[] args) 
 { SortedMap<Integer, String> map = new TreeMap<Integer, String>(); 
 //CRIA UMA COLEÇÃO MAP COM SUAS CHAVES DESORDENADAS (FORA DE ORDEM)
 map.put( new Integer( 2 ), "EDIBERTO" ); map.put( new Integer( 3 ), "ADÃO MORAIS" ); 
 map.put( new Integer( 4 ), "ANA CLARA" ); 
 map.put( new Integer( 1 ), "AUDILENE MARIA" );
 //Retorna uma visualização Set dos mapeamentos contidos neste mapa
 Set s = map.entrySet(); 
 Iterator i = s.iterator();// Usando o iterador no SortedMap
 // SAÍDA ORDENADA POR CHAVE DO MAP. 
 while (i.hasNext()) 
 { Map.Entry m = (Map.Entry)i.next(); 
 int key = (Integer)m.getKey(); 
 String value = (String)m.getValue(); 
 System.out.println( "Chave : " + key + " Valor : " + value); 
 } 
 } 
 } 
2019.2
*
Java Collection Framework
(Coleções)
Implementações
	- Classes que implementam as interfaces do framework de
 coleções.
2019.2
*
Java Collection Framework
(Coleções)
Interfaces auxiliares (Iterator e ListIterator) 
	 - Iterator
 Interface que define as operações básicas para o
 percorrimento dos elementos da coleção.
 
2019.2
*
Java Collection Framework
(Coleções)
	 - iterar sobre os elementos de uma coleção
 Pode-se usar o comando for e o Iterator da coleção:
package model;
import java.util.Arrays;
import java.util.List;
public class ForTeste {
 public static void main(String[] args) {
 List<Integer> itens = Arrays.asList( 30, 8, 40, 5, 11 );
 for(Integer item : itens){
 System.out.println(item);
 }
 }
}
USO DO COMANDO FOR
Interfaces auxiliar (Iterator) 
2019.2
*
Java Collection Framework
(Coleções)
Iterator – (Listando os elementos de um ArrayList - Exemplo
package model;
import java.util.ArrayList;
import java.util.Iterator;
public class TestaIterator {
 public static void main(String args[]) {
 ArrayList al = new ArrayList();
 al.add("EDIBERTO"); al.add("PEDRO");
 al.add("ANTONIO"); System.out.print("USANDO O Iterator DA COLEÇÃO");
 System.out.println(); System.out.print("PROFESSOR: EDIBERTO MARIANO"); 
 System.out.println(); System.out.print(" "); System.out.println();
 // Usamos o iterator para mostrar o conteúdo do ArrayList
 System.out.print("ELEMENTOS ORIGINAIS DO ARRAYLIST: ");
 Iterator itr = al.iterator();
 while(itr.hasNext()) {
 Object element = itr.next();
 System.out.print(element + " ");
 }
 System.out.println(); 
 }
}
USO DO Iterator DA COLEÇÃO
2019.2
*
Java Collection Framework
(Coleções)
Interface auxiliar - ListIterator
	 Interface que estende Iterator, 
adicionando funções
específicas para coleções
do tipo List.
2019.2
*
Java Collection Framework (Coleções)
Interface auxiliar – ListIterator (exemplo)
package model;
import java.util.ArrayList; import java.util.Iterator;
import java.util.ListIterator; public class TestaListIterator {
 public static void main(String args[]) {
 ArrayList al = new ArrayList();
 al.add("EDIBERTO"); al.add("PEDRO"); al.add("ANTONIO");
 System.out.print("ELEMENTOS DO ARRAYLIST ORDEM ORIGINAL");System.out.println();
 Iterator itr = al.iterator();
 while(itr.hasNext()) {
 Object element = itr.next();
 System.out.print(element + " "); }
 System.out.println(); System.out.println(); 
 // Modify objects being iterated
 ListIterator litr = al.listIterator();
 while(litr.hasNext()) {
 Object element = litr.next();
 litr.set(element + " ");
 }
 System.out.print("ELEMENTOS DO ARRAYLIST ORDEM INVERTIDA");
 System.out.println();
 while(litr.hasPrevious()) {
 Object element = litr.previous();
 System.out.print(element + " ");
 }
 System.out.println(); 
 }
}
2019.2
*
Java Collection Framework
(Coleções)
for-each
	 - Novidade do Java 5!
	 - Variação do comando for com sintaxe
 simplificada para iterar nos elementos de uma
 coleção.
2019.2
*
Java Collection Framework
(Coleções)
for-each (Listando os elementos de uma lista - Exemplo
package model;
import java.util.Arrays;
import java.util.List;
public class ForEachTeste {
 public static void main(String[] args) {
 List<Integer> itens = Arrays.asList( 10, 8, 50, 1, 30 );
 itens.forEach(item->System.out.println(item));
 }
}
2019.2
*
Exercícios
1 – Codifique um programa usando Collection List em que:
	a – Crie um Array, atribuindo os nomes de cinco pessoas;
 b – Exiba na tela a:
		 b1 – o Array com todos seus elementos;
 b2 – elemento por elemento do Array.
2 - Codifique um programa usando Collection Set em que:
	a – seja informado via teclado com uso da classe Scanner cinco nomes de frutas em 
 uma coleção;
 b – exiba na tela a:
		 b1 – os elementos os elementos da coleção;
 b1 – mensagem informando se foram informados nomes repetidos ou não na 
 coleção.
3 – Codifique um programa usando o comando for-each C para listar os elementos de uma Lista:
	Obs. Os elementos da lista deverão ser informados via teclado com uso da classe Scanner.
2019.2
*
Exercícios
4 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado o primeiro nome de cinco pessoas;
 b – Use a classe Scanner para a entrada dos dados.
5 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado o primeiro nome de cinco pessoas;
 b – Use a classe Scanner para a entrada dos dados.
 c – Após todos os nomes armazenados na lista, exiba-os na tela
6 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado cinco números tipo inteiros;
 b – Use a classe Scanner para a entrada dos dados.
 c – Após todos os números armazenados na lista, exiba-os na tela
7 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado cinco números tipo inteiros;
 b – Use a classe Scanner para a entrada dos dados.
 c – Após todos os números armazenados na lista, exiba-os na tela usando o
 comando for-each
2019.2
*
Exercícios
8 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado cinco números tipo inteiros;
 b – Use a classe Scanner para a entrada dos dados.
 c – Após todos os números armazenados na lista, exiba-os na tela usando o comando for
9 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado o primeiro nome de cinco pessoas;
 b – Use a classe Scanner para a entrada dos dados.
 c – Após todos os nomes armazenados na lista, exiba-os na tela usando o comando 
 for-each.
10 – Codifique um programa em java que:
	a – Crie uma Lista, atribuindo via teclado o primeiro nome de cinco pessoas;
 b – Use a classe Scanner para a entrada dos dados.
 c – Após todos os nomes armazenados na lista, exiba-os na tela usando o comando for
11 – Codifique um programa usando Collection QUEUE em que: 
	a – atribua via programa os nomes de dez frutas em uma coleção.
 b – exiba os dados inseridos na coleção.
12 – Quais as características da interface Set?
13 - Codifique em java, as linhas de códigos para criar uma Coleção List() e adicionar dois elementos na lista criada.
2019.2
*
Exercícios
12 - Codifique um programa usando Collection QUEUE em que: 
	a – atribua via programa os números 100, 150 e 200 em uma coleção.
 b – exiba os números inseridos na coleção.
13 – Quais as características da interface Set?
14 - Codifique em java, as linhas de códigos para criar uma Coleção List() e adicionar dois elementos na lista criada.
 
 
 
*
 
 
 
*
*
 
 
 
*
 
 
 
*
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
**
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*
 
 
 
*

Continue navegando