Orientação a Objeto - Coleções de Objetos

Objetivos da seção

Coleções de Objetos: Iteração Usando Índices

saco.gif (3841 bytes)

O Array como Coleção

/*
 * Uso de arrays
 */

import p1.io.*;
import java.util.*;

public class Cadastro1 {
	public static void main(String[] args) {
		final int MAX_PESSOAS = 10;
		final String prompt = "Digite o nome de uma pessoa: ";

		String[] cadastro = new String[MAX_PESSOAS];
		String nome;
		// entrada dos dados de cadastro
		int numPessoas = 0;
		while ((nome = Entrada.in.lerLinha(prompt)) != null) {
			cadastro[numPessoas++] = nome;
		}

		// imprime o cadastro antes da ordenação
		System.out.println();
		for (int i = 0; i < numPessoas; i++) {
			System.out.println(cadastro[i]);
		}

		// ordena o cadastro
		String[] cadOrdenado = new String[numPessoas];
		for (int i = 0; i < numPessoas; i++) {
			cadOrdenado[i] = cadastro[i];
		}
		Arrays.sort(cadOrdenado);

		// imprime o cadastro ordenado
		System.out.println();
		for (int i = 0; i < numPessoas; i++) {
			System.out.println(cadOrdenado[i]);
		}
	} // main
} // Cadastro1
Digite o nome de uma pessoa: roberto
Digite o nome de uma pessoa: jacques
Digite o nome de uma pessoa: camilo
Digite o nome de uma pessoa: peter
Digite o nome de uma pessoa: aninha
Digite o nome de uma pessoa: jean
Digite o nome de uma pessoa: juliana
Digite o nome de uma pessoa: bruno
Digite o nome de uma pessoa: rodrigo
Digite o nome de uma pessoa: alexandre
Digite o nome de uma pessoa: ^Z

roberto
jacques
camilo
peter
aninha
jean
juliana
bruno
rodrigo
alexandre

alexandre
aninha
bruno
camilo
jacques
jean
juliana
peter
roberto
rodrigo
java -classpath .;packagep1\p1.jar Cadastro1 < cadastro.txt
/*
 * Cadastro com ArrayList em vez de array.
 * Mostra como ArrayList é essencialmente um array que cresce sob demanda.
 */

import p1.io.*;
import java.util.*;

public class Cadastro3 {
	public static void main(String[] args) {
		final String prompt = "Digite o nome de uma pessoa: ";

		List cadastro = new ArrayList();
		String nome;
		// entrada dos dados de cadastro
		while ((nome = Entrada.in.lerLinha(prompt)) != null) {
			cadastro.add(nome);
		}

		// imprime o cadastro antes da ordenação
		// (deveria usar um iterador, mas queremos mostrar
		// como o ArrayList é semelhante a um array)
		System.out.println();
		for (int i = 0; i < cadastro.size(); i++) {
			System.out.println(cadastro.get(i));
		}

		// ordena o cadastro
		Collections.sort(cadastro);

		// imprime o cadastro ordenado
		System.out.println();
		for (int i = 0; i < cadastro.size(); i++) {
			System.out.println(cadastro.get(i));
		}
	} // main
} // Cadastro3

Coleções de Objetos: Iteração Usando um Iterador

/*
 * Laço: Coleção genérica List
 */

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import p1.aplic.cartas.Baralho;
import p1.aplic.cartas.Carta;
import p1.io.Entrada;

public class Cartas6 {
	public static void main(String[] args) {

		Baralho baralho = new Baralho();
		baralho.baralhar();
		// List é uma "Coleção" de objetos genéricos
		List<Carta> aMao = new ArrayList<Carta>();

		int n = Entrada.in.lerInt("Quantas cartas na mao? ");

		for (int i = 0; i < n; i++) {
			aMao.add(baralho.pegaCarta());
		}

		// dedo server para varrer (iterar) as cartas na mao
		Iterator<Carta> dedo = aMao.iterator();
		Carta maiorCarta = null;
		while (dedo.hasNext()) {
			Carta proximaCarta = dedo.next();
			if (maiorCarta == null || proximaCarta.compareTo(maiorCarta) > 0) {
				maiorCarta = proximaCarta;
			}
		}
		// List tem um toString bonitinho também! :-)
		System.out.println("A mao: " + aMao);
		System.out.println("A maior carta: "
				+ (maiorCarta == null ? "nao tem" : maiorCarta));
	}
}
Quantas cartas na mao? 5
A mao: [SETE de ESPADAS, CINCO de ESPADAS, TRES de OUROS, NOVE de PAUS, SEIS de OUROS]
A maior carta: NOVE de PAUS

Coleções de Objetos: Pesquisa

/*
 * Laços aninhados
 */

import java.util.ArrayList;
import java.util.List;

import p1.aplic.geral.Pessoa;
import p1.io.Entrada;

public class Pesquisa1 {
	public static void main(String[] args) {
		final String prompt1 = "Digite o nome de uma pessoa (\"fim\" para terminar): ";
		final String prompt2 = "Digite o CPF dessa pessoa: ";
		final String prompt3 = "Digite o CPF a pesquisar (\"fim\" para terminar): ";
		List cadastro;
		String nome;
		String cpf;

		cadastro = new ArrayList();

		// entrada dos dados de cadastro
		while ((nome = Entrada.in.lerLinha(prompt1)) != null
				&& !nome.equals("fim")) {
			cpf = Entrada.in.lerLinha(prompt2);
			if (cpf != null) {
				cadastro.add(new Pessoa(nome, cpf));
			}
		} // while

		// pesquisa de dados por cpf
		// observe o aninhamento de laços
		// Seria possivel usar o método indexOf de List, mas
		// queremos mostrar como fazer pesquisa sequencial num array
		while ((cpf = Entrada.in.lerLinha(prompt3)) != null
				&& !cpf.equals("fim")) {
			boolean achei = false;
			for (int i = 0; i < cadastro.size(); i++) {
				Pessoa p = (Pessoa) cadastro.get(i);
				if (p.getCPF().equals(cpf)) {
					System.out.println(p.getNome());
					achei = true;
				}
			} // for
			if (!achei) {
				System.out.println("Nao achei CPF " + cpf + " no cadastro.");
			}
		} // while
	} // main
} // Pesquisa1
Digite o nome de uma pessoa ("fim" para terminar): jacques
Digite o CPF dessa pessoa: 123456789-10
Digite o nome de uma pessoa ("fim" para terminar): biluca
Digite o CPF dessa pessoa: 012345678-91
Digite o nome de uma pessoa ("fim" para terminar): fim
Digite o CPF a pesquisar ("fim" para terminar): 123456789-10
jacques
Digite o CPF a pesquisar ("fim" para terminar): 123456789-11
Nao achei CPF 123456789-11 no cadastro.
Digite o CPF a pesquisar ("fim" para terminar): 012345678-91
biluca
Digite o CPF a pesquisar ("fim" para terminar): fim

Os Comandos break e continue

/*
 * Uso de break
 */

import java.util.ArrayList;
import java.util.List;

import p1.aplic.geral.Pessoa;
import p1.io.Entrada;

public class Pesquisa2 {
	public static void main(String[] args) {
		final String prompt1 = "Digite o nome de uma pessoa (\"fim\" para terminar): ";
		final String prompt2 = "Digite o CPF dessa pessoa: ";
		final String prompt3 = "Digite o CPF a pesquisar (\"fim\" para terminar): ";
		List cadastro;
		String nome;
		String cpf;

		cadastro = new ArrayList();

		// entrada dos dados de cadastro
		while ((nome = Entrada.in.lerLinha(prompt1)) != null
				&& !nome.equals("fim")) {
			cpf = Entrada.in.lerLinha(prompt2);
			if (cpf != null) {
				cadastro.add(new Pessoa(nome, cpf));
			}
		} // while

		// pesquisa de dados por cpf
		// observe o aninhamento de laços
		// Seria possivel usar o método indexOf de List, mas
		// queremos mostrar como fazer pesquisa sequencial numa List
		while ((cpf = Entrada.in.lerLinha(prompt3)) != null
				&& !cpf.equals("fim")) {
			Pessoa p = null;
			for (int i = 0; i < cadastro.size(); i++) {
				p = (Pessoa) cadastro.get(i);
				if (p.getCPF().equals(cpf)) {
					System.out.println(p.getNome());
					break; // cai fora do laço de pesquisa
				}
			} // for
			if (p == null || !p.getCPF().equals(cpf)) {
				System.out.println("Nao achei CPF " + cpf + " no cadastro.");
			}
		} // while
	} // main
} // Pesquisa2
/*
 * Uso de continue
 * Cadastro onde linha iniciando com # são comentários
 */

import java.util.ArrayList;
import java.util.List;

import p1.aplic.geral.Pessoa;
import p1.io.Entrada;

public class Pesquisa3 {
	public static void main(String[] args) {
		final String prompt1 = "Digite o nome de uma pessoa (\"fim\" para terminar): ";
		final String prompt2 = "Digite o CPF dessa pessoa: ";
		final String prompt3 = "Digite o CPF a pesquisar (\"fim\" para terminar): ";
		final String INICIO_COMENTÁRIO = "#";
		List cadastro;
		String nome;
		String cpf;

		cadastro = new ArrayList();

		// entrada dos dados de cadastro
		while ((nome = Entrada.in.lerLinha(prompt1)) != null
				&& !nome.equals("fim")) {
			if (nome.startsWith(INICIO_COMENTÁRIO)) {
				continue;
			}
			// agora, processa informação de verdade
			cpf = Entrada.in.lerLinha(prompt2);
			if (cpf != null) {
				cadastro.add(new Pessoa(nome, cpf));
			}
		} // while

		// pesquisa de dados por cpf
		// observe o aninhamento de laços
		// Seria possivel usar o método indexOf de List, mas
		// queremos mostrar como fazer pesquisa sequencial numa List
		while ((cpf = Entrada.in.lerLinha(prompt3)) != null
				&& !cpf.equals("fim")) {
			Pessoa p = null;
			for (int i = 0; i < cadastro.size(); i++) {
				p = (Pessoa) cadastro.get(i);
				if (p.getCPF().equals(cpf)) {
					System.out.println(p.getNome());
					break; // cai fora do laço de pesquisa
				}
			} // for
			if (p == null || !p.getCPF().equals(cpf)) {
				System.out.println("Nao achei CPF " + cpf + " no cadastro.");
			}
		} // while
	} // main
} // Pesquisa3
Digite o nome de uma pessoa ("fim" para terminar): jacques
Digite o CPF dessa pessoa: 123456789-01
Digite o nome de uma pessoa ("fim" para terminar): aninha
Digite o CPF dessa pessoa: 012345678-90
Digite o nome de uma pessoa ("fim" para terminar): # isso eh um comentario
Digite o nome de uma pessoa ("fim" para terminar): #isso tambem
Digite o nome de uma pessoa ("fim" para terminar): fim
Digite o CPF a pesquisar ("fim" para terminar): 123456789-01
jacques
Digite o CPF a pesquisar ("fim" para terminar): 012345678-90
aninha
Digite o CPF a pesquisar ("fim" para terminar): #isso tambem
Nao achei CPF #isso tambem no cadastro.
Digite o CPF a pesquisar ("fim" para terminar): fim

Programas Adicionais para o Aluno Estudar:

oo-2 anterior próxima