Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo - Criando um objeto • Objeto é uma instância de uma classe; • Usamos o operador new para criar um objeto. Variável que conterá uma referência a um objeto ContaCorrente minhaConta; minhaConta = new ContaCorrente ( ); Criação do objeto ContaCorrente minhaConta = new ContaCorrente ( ); Programação II – Prof. Mateus Raeder Garbage Collection String str = “Primeiro espaço”; System.out.println (“Usando memória original: “+str); str = “Outro espaço”; System.out.println (“Usando outro espaço de memória: “+str); Primeiro espaço str Área de memória liberada pelo Garbage Collection 10 100 Outro espaço System.gc(); 10 100 Não obriga a limpar, mas “pede” para que o Garbage Collection limpe se possível Programação II – Prof. Mateus Raeder Exercícios • Crie uma classe Endereco, que possui uma rua, um número e uma cidade. No construtor, receba todos os atributos por parâmetro. Crie métodos para retornar estes parâmetros (getters). • Crie uma classe Imovel, que possui um valor e um Endereco. No construtor, passe por parâmetro o valor, e diga que o imóvel é na Largo Patrono Fernando Kroeff, número 2, em Porto Alegre. Crie os métodos getEndereco e getValor. Programação II – Prof. Mateus Raeder Exercícios • Crie uma classe Pessoa, que possui um nome (passado por parâmetro no construtor) e um imóvel de R$650.000,00. Crie um método getNome e um método getImóvel. • Crie uma classe Teste. No método main, crie uma pessoa chamada Anacreonte. Em seguida, imprima o endereço (por extenso) e o valor do imóvel que esta pessoa possui. Programação II – Prof. Mateus Raeder Respostas public class Endereco{ private String rua; private int numero; private String cidade; public Endereco(String rua, int numero, String cidade){ this.rua = rua; this.numero = numero; this.cidade = cidade; } public String getRua(){ return rua; } public int getNumero(){ return numero; } } public String getCidade(){ return cidade; } Programação II – Prof. Mateus Raeder Respostas public class Imovel{ private double valor; private Endereco endereco; public Imovel(double valor){ this.valor = valor; endereco = new Endereco("Largo Patrono Fernando Kroeff", 2, "Porto Alegre"); } public double getValor(){ return valor; } } public Endereco getEndereco(){ return endereco; } Programação II – Prof. Mateus Raeder Respostas public class Pessoa{ private String nome; private Imovel imovel; public Pessoa(String nome){ this.nome = nome; imovel = new Imovel(650.000); } public String getNome(){ return nome; } } public Imovel getImovel(){ return imovel; } Programação II – Prof. Mateus Raeder Respostas public class Teste{ public static void main(String args[]){ Pessoa p = new Pessoa("Anacreonte"); System.out.println("Dados de "+p.getNome()+": \n"); System.out.println("Valor do imóvel: "+p.getImovel().getValor()+"\n"); } } System.out.println("ENDEREÇO:"); System.out.println("Rua: "+p.getImovel().getEndereco().getRua()); System.out.println("Número: "+p.getImovel().getEndereco().getNumero()); System.out.println("Cidade: "+p.getImovel().getEndereco().getCidade()); Programação II – Prof. Mateus Raeder Listas: Tipo de Armazenamento • O tipo de armazenamento de uma lista linear pode ser classificado de acordo com a posição relativa (sempre contígua ou não) na memória de dois nós consecutivos na lista. • Lista linear com alocação seqüencial de memória – Nós em posições contíguas de memória – Geralmente representado por arrays – Útil para implementar filas e pilhas (variáveis para controlar fim e início) Programação II – Prof. Mateus Raeder Listas: Tipo de Armazenamento • Lista linear com alocação encadeada – Posições de memória são alocadas a medida que são necessárias – Nós encontram-se aleatoriamente dispostos na memória e são interligados por ponteiros, que indicam a próxima posição da tabela • Nós precisam de um campo a mais: campo que indica o endereço do próximo nó. Programação II – Prof. Mateus Raeder Listas Simplesmente Encadeadas • Uma lista simplesmente encadeada é uma seqüência de objetos alocados dinamicamente, onde cada objeto faz referência ao seu sucessor na lista • Lista encadeada básica: – possui variável firstNode que referencia para o primeiro elemento da lista – cada Objeto refere a seu sucessor – ultimo elemento contém a referência null (para indicar que não referencia nenhum outro). Ineficiente: se queremos inserir um elemento no final da lista, temos que localizar o último elemento: para tanto é necessário percorrer todos os elementos da lista. Programação II – Prof. Mateus Raeder Lista Encadeada Básica data firstNode Apontador para o primeiro nó da lista next Node ... null final de lista Programação II – Prof. Mateus Raeder Lista encadeada com referência ao último elemento da lista • Como tornar mais eficiente: – utilizar uma segunda variável, chamada lastNode, que referencia o último elemento da lista. – eficiência obtida a custa do espaço adicional firstNode Apontador para o primeiro nó da lista lastNode Apontador para o último nó da lista ... null final de lista Programação II – Prof. Mateus Raeder Classe Node public class Node { private String data; private Node nextNode; } data public Node( String element ) { this( element, null ); } public Node( String element, Node node ) { data = element; nextNode = node; } public String getData() { return data; } public void setData(String element){ data = element; } public Node getNext() { return nextNode; } public void setNext(Node node) { nextNode = node; } nextNode Node Programação II – Prof. Mateus Raeder Operações sobre lista – public boolean isEmpty() • verifica se a lista está vazia – public void insertAtFront( String element ) • insere o elemento na frente da lista – public void insertAtBack( String element ) • insere o elemento no final da lista – public String removeFromFront() • remove e retorna o primeiro elemento da lista Programação II – Prof. Mateus Raeder Operações sobre lista – public String removeFromBack() • remove e retorna o último elemento da lista – public String getFirst() • retorna o primeiro elemento da lista, sem removê-lo – public String getLast() • remove e retorna o último elemento da lista, sem removê-lo – public void print() • exibe o conteúdo da lista Programação II – Prof. Mateus Raeder Class List (1/5) public class List { private Node firstNode; private Node lastNode; private String name; public List() { this("list"); } public List(String listName) { name = listName; firstNode = lastNode = null; } public boolean isEmpty() { return firstNode == null; } Programação II – Prof. Mateus Raeder Class List (2/5) public String getFirst() throws UnderflowException { if (isEmpty()) throw new UnderflowException(); return firstNode.getData(); } public String getLast() throws UnderflowException { if (isEmpty()) throw new UnderflowException(); return lastNode.getData(); } Programação II – Prof. Mateus Raeder Class List (3/5) public void insertAtFront (String insertItem) { if (isEmpty()) { firstNode = lastNode = new Node(insertItem); } else { firstNode = new Node(insertItem, firstNode); } } public void insertAtBack (String insertItem) { if (isEmpty()) { firstNode = lastNode = new Node(insertItem); } else { lastNode.setNext(new Node(insertItem)); lastNode = lastNode.getNext(); } } Programação II – Prof. Mateus Raeder Class List (4/5) public String removeFromFront() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } String removedItem = firstNode.getData(); if (firstNode == lastNode) { firstNode = lastNode = null; } else { firstNode = firstNode.getNext(); } return removedItem; } Programação II – Prof. Mateus Raeder Class List (4/5) public String removeFromBack() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } String removedItem = lastNode.getData(); if (firstNode == lastNode) { firstNode = lastNode = null; } else { Node current = firstNode; while (current.getNext() != lastNode) { current = current.getNext(); } lastNode = current; current.setNext(null); } return removedItem; } Programação II – Prof. Mateus Raeder Class List (5/5) public void print() { if (isEmpty()) { System.out.println("Empty " + name); } else { System.out.print("The " + name + " is: "); Node current = firstNode; while (current != null) { System.out.print(current.getData().toString() + " "); current = current.getNext(); } System.out.println("\n"); } } Programação II – Prof. Mateus Raeder Testando a lista public class ListTest { public static void main(String args[]) { List list = new List(); list.insertAtFront("a"); list.insertAtFront("b"); list.insertAtBack("c"); list.insertAtBack("d"); list.print(); String removedEl; try { removedEl = list.removeFromFront(); System.out.println(removedEl.toString() + " removed"); removedEl = list.removeFromFront(); System.out.println(removedEl.toString() + " removed"); removedEl = list.removeFromBack(); System.out.println(removedEl.toString() + " removed"); } } removedEl = list.removeFromBack(); System.out.println(removedEl.toString() + " removed"); } catch (UnderflowException e) { System.out.println(e.toString()); } Programação II – Prof. Mateus Raeder Pilha (Stack) Programação II – Prof. Mateus Raeder Pilhas (Stack) • Operações sobre Pilhas: – public boolean isEmpty() • verifica se a pilha está vazia – public void push( String element ) • insere o nó no topo da pilha – public String pop() • retorna e remove o nó do topo da pilha – public String getTop () • retorna o nó do topo da pilha, sem removê-lo – public void print() • exibe todos os nós da pilha Programação II – Prof. Mateus Raeder Pilha public class Stack { private Node top; public Stack() { } public boolean isEmpty() { return (top == null); } public String getTop() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } else { return top.getData(); } } Programação II – Prof. Mateus Raeder Pilha public void push (String insertItem) { Node n = new Node(insertItem); n.setNext(top); top = n; } public String pop() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } Node ret = top; top = top.getNext(); return ret.getData(); } Programação II – Prof. Mateus Raeder Pilha public void print() { if (isEmpty()) { System.out.println("Stack Empty "); } else { Node current = top; while (current != null) { System.out.println (current.getData().toString()); current = current.getNext(); } System.out.println("\n"); } } } Programação II – Prof. Mateus Raeder Testando a Pilha public class StackTest { public static void main(String args[]) { Stack stack = new Stack(); stack.push("a"); stack.push("b"); stack.push("c"); stack.push("d"); stack.print(); try { String removedEl = null; } } while (!stack.isEmpty()) { removedEl = stack.pop(); System.out.println(removedEl.toString() + " popped"); } } catch (UnderflowException e) { System.out.println(e.toString()); } Programação II – Prof. Mateus Raeder Filas (Queue) Programação II – Prof. Mateus Raeder Operações sobre Filas (Queue) – public boolean isEmpty() • verifica se a fila está vazia – public void enqueue( String element ) • insere o elemento no final da fila – public String dequeue() • remove e retorna o primeiro elemento da fila – public String getFirst() • retorna o primeiro elemento da fila, sem removê-lo – public void print() • exibe o conteúdo da fila Programação II – Prof. Mateus Raeder Fila public class Queue { private Node firstNode; private Node lastNode; public boolean isEmpty() { return firstNode == null; } public String getFirst() throws UnderflowException { if (isEmpty()) throw new UnderflowException(); return firstNode.getData(); } Programação II – Prof. Mateus Raeder Fila public void print() { if (isEmpty()) { System.out.println("Empty Queue"); } else { Node current = firstNode; while (current != null) { System.out.print(current.getData().toString() + ", "); current = current.getNext(); } System.out.println("\n"); } } Programação II – Prof. Mateus Raeder Fila public void enqueue (String insertItem) { if (isEmpty()) { firstNode = lastNode = new Node(insertItem); } else { lastNode.setNext(new Node(insertItem)); lastNode = lastNode.getNext(); } } Programação II – Prof. Mateus Raeder Fila } public String dequeue() throws UnderflowException { if (isEmpty()) { throw new UnderflowException(); } String removedItem = firstNode.getData(); if (firstNode == lastNode) firstNode = lastNode = null; else firstNode = firstNode.getNext(); return removedItem; } Programação II – Prof. Mateus Raeder Testa Fila public class QueueTest { public static void main( String args[] ) { Queue queue = new Queue(); } } queue.enqueue( "1" ); queue.enqueue( "2" ); queue.enqueue( "3" ); queue.enqueue( "4" ); queue.print(); try { Object removedEl = null; while (!queue.isEmpty()) { removedEl = queue.dequeue(); System.out.println( removedEl.toString() + " dequeued" ); } } catch ( UnderflowException e ) { e.printStackTrace(); } Programação II – Prof. Mateus Raeder