Algoritmos e Programação por Prof. Dr. Paulo Roberto Gomes Luzzardi facebook: Paulo Roberto Gomes Luzzardi WhatsApp: 91648037 e-mail: [email protected] e [email protected] e-mail (Senac): [email protected] DropBox: https://www.dropbox.com/sh/kea9kr4j2qttnjg/4xXvw0pvxX?m Hostinger: http://pluzzardi.w.pw e http://pluzzardi.zz.mu (Home Page) OS X Server (Apple): http://pluzzardi.no-ip.info:8080 (Home Page) Versão 2.12 26-10-2015 Bibliografia recomendada DEITEL, H. M. and DEITEL, P. J. Java: como programar, 8. ed.: São Paulo: Pearson, 2010 (ISBN 85-3630123-6). Pelotas, segunda-feira, 26 de outubro de 2015 (10:37:21 am) Sumário 1. Projeto de Classes ........................................................................................................................................... 6 1.1 Escrevendo uma classe em Java (Conceitos básicos) ............................................................................... 6 1.2 Tipos de Atributos .................................................................................................................................... 6 1.3 Sobrecarga de Métodos .......................................................................................................................... 21 1.4 Referência this ........................................................................................................................................ 22 1.5 Lista de exercícios: Classes .................................................................................................................... 25 2. Interface e Polimorfismo .............................................................................................................................. 38 2.1 Interface .................................................................................................................................................. 38 2.2 Polimorfismo .......................................................................................................................................... 41 2.3 Lista de Exercícios: Interface e Polimorfismo ........................................................................................ 43 3. Herança em Java ........................................................................................................................................... 45 3.1 Herança simples...................................................................................................................................... 45 3.2 Controle de acesso na definição de uma classe derivada ........................................................................ 46 3.3 Tipos de acessos (especificadores de acesso) ......................................................................................... 48 3.4 Lista de exercícios: Herança ................................................................................................................... 50 4. Métodos de entrada e saída de dados ........................................................................................................... 55 4.1 Entrada de dados via teclado .................................................................................................................. 55 4.2 Saída de dados via tela ........................................................................................................................... 58 4.3 Saída formatada (System.out.printf) ....................................................................................................... 59 4.4 Lista de Exercícios: Métodos de Entrada e Saída ................................................................................... 61 5. Interfaces e Containers (Classes existentes em Java) ................................................................................... 62 5.1 Coleções (Collection FrameWork) ......................................................................................................... 62 5.2 Interfaces ................................................................................................................................................ 62 5.3 Vector (Vetor) (Classe Obsoleta) ........................................................................................................... 63 5.4 LinkedList (Lista Encadeada Simples) .................................................................................................... 67 5.5 Arrays (array)......................................................................................................................................... 72 5.6 ArrayList (lista de array) ........................................................................................................................ 77 5.6.1 Lista de exercícios: Vector, ArrayList e LinkedList ............................................................................. 79 5.7 ArrayList bidimensional ......................................................................................................................... 85 5.8 Strings (Cadeia de Caracteres) ............................................................................................................... 90 5.8.1 Métodos para manipular Strings .......................................................................................................... 92 5.8.2 Lista de exercícios: Strings .................................................................................................................. 95 5.9 Classe Object .......................................................................................................................................... 97 5.10 Classe Iterator ...................................................................................................................................... 99 5.11 Classe LinkedHashSet ........................................................................................................................ 100 5.12 Classe Genérica em Java .................................................................................................................... 101 5.13 Fila Prioritária (PriorityQueue) .......................................................................................................... 103 6. Listas Lineares: Pilhas, Filas e Deques ....................................................................................................... 107 6.1 Implementação de uma Pilha (Stack).................................................................................................... 107 6.2 Implementação de uma Fila (Queue) .................................................................................................... 113 6.3 Implementação de um Deque (ArrayDeque) ........................................................................................ 117 6.4 Lista de Exercícios: Listas Lineares (Pilhas, Filas e Deques) ............................................................... 123 7. Mapas (Maps) ............................................................................................................................................. 128 7.1 Conceitos básicos sobre Mapas ............................................................................................................ 128 7.2 Lista de Exercícios: Mapas ................................................................................................................... 132 8. Processamento de fluxos de dados, caracteres e objetos (Arquivos) .......................................................... 134 8.1 Métodos para manipular arquivos em Java ........................................................................................... 136 8.2 Abertura de um arquivo texto ............................................................................................................... 138 8.3 Listar um diretório ................................................................................................................................ 139 8.4 Manipulação de um arquivo de palavras .............................................................................................. 140 8.5 Arquivo Texto ...................................................................................................................................... 143 8.6 Lista de exercícios: Arquivos (Files) .................................................................................................... 152 8.7 Acesso randômico em arquivos texto ................................................................................................... 155 8.8 Arquivo binário de objetos em Java ..................................................................................................... 156 8.9 Leitura e gravação de objetos (registro) em Arquivos .......................................................................... 157 8.9.1 Gravação de objetos em um arquivo binário de objetos .................................................................... 158 8.9.2 Leitura objetos em um arquivo binário de objetos ............................................................................. 161 9. Noções de desenvolvimento de aplicações em camadas (MVC) ................................................................ 164 9.1 Conceitos .............................................................................................................................................. 164 9.2 Primeiro exemplo da utilização do MVC (ProgMVCPessoa) .............................................................. 164 9.3 Segundo exemplo da utilização do MVC (ProgMVCPessoa2) ............................................................ 168 2 10. Conceitos gerais........................................................................................................................................ 174 10.1 Como é calculado o hashcode no Java ............................................................................................... 174 11. Lista Encadeada Simples em Java ............................................................................................................ 175 11.1 Lista Encadeada de Inteiros ................................................................................................................ 175 11.2 Lista Encadeada Genérica (String, Integer ou Double) ...................................................................... 180 12. Lista Duplamente Encadeada em Java ...................................................................................................... 184 13. Classe entrada de inteiros e reais em Java sem erro na digitação ............................................................. 192 14. Alguns programas exemplos em Java ....................................................................................................... 197 14.1 Torre de Hanoi (Pilha - Stack) ............................................................................................................ 197 14.2 Analisador de Expressões usando Stack ............................................................................................. 202 14.3 Calculadora Polonesa Reversa ............................................................................................................ 205 14.4 Jogo Quebra-Cabeças ......................................................................................................................... 207 Anexos: Solução dos problemas propostos no Livro ...................................................................................... 211 Anexo 1.4 Solução da Lista: Classes .......................................................................................................... 211 1.4.1 ProgCirculo ................................................................................................................................... 211 1.4.2 ProgPeso ........................................................................................................................................ 211 1.4.3 ProgValidaCPF .............................................................................................................................. 212 1.4.4 ProgDiaSemana ............................................................................................................................. 213 1.4.5 ProgTestData ................................................................................................................................. 214 1.4.6 ProgVetorSort ................................................................................................................................ 215 1.4.7 ProgPessoa .................................................................................................................................... 218 1.4.8 ProgPessoa2 .................................................................................................................................. 219 1.4.9 ProgPessoas ................................................................................................................................... 220 1.4.10 ProgAgenda ................................................................................................................................. 221 Anexo 2.3 Solução da Lista: Interface e Polimorfismo .............................................................................. 223 2.3.1 ProgInterface_1 ............................................................................................................................. 223 2.3.2 ProgInterface_2 ............................................................................................................................. 224 2.3.2 ProgInterface_3 ............................................................................................................................. 225 Anexo 3.4 Solução da Lista: Herança ......................................................................................................... 226 3.4.1 Herança (Primeiro) ........................................................................................................................ 226 3.4.2 Herança (Segundo) ........................................................................................................................ 227 3.4.3 Herança (Terceiro) ........................................................................................................................ 229 Anexo 4.4 Solução da Lista: Entrada e Saída Bufferizada ......................................................................... 230 4.4.1 ProgBuffer_1 ................................................................................................................................. 230 4.4.2 ProgBuffer_2 ................................................................................................................................. 231 Anexo 5.6.1 Solução da Lista: Vector, ArrayList e LinkedList ................................................................... 232 5.6.1.1 ProgVector_1 ............................................................................................................................. 232 5.6.1.2 ProgVector_2 ............................................................................................................................. 232 5.6.1.3 ProgVector_3 ............................................................................................................................. 233 5.6.1.4 ProgVector_4 ............................................................................................................................. 234 5.6.1.5 ProgVector_5 ............................................................................................................................. 235 5.6.1.6 ProgVector_6 ............................................................................................................................. 235 5.6.1.7 ProgVector_7 ............................................................................................................................. 236 5.6.1.8 ProgVector_8 ............................................................................................................................. 237 5.6.1.9 ProgVector_9 ............................................................................................................................. 237 5.6.1.10 ProgVector_10 ......................................................................................................................... 238 5.6.1.11 ProgVector_11 ......................................................................................................................... 239 5.6.1.12 ProgVector_12 ......................................................................................................................... 240 5.6.1.13 ProgVector_13 ......................................................................................................................... 242 5.6.1.14 ProgVector_14 ......................................................................................................................... 244 5.6.1.15 ProgVector_15 ......................................................................................................................... 246 5.6.1.16 ProgVector_16 ......................................................................................................................... 247 Anexo 5.8.2 Solução da Lista: Strings........................................................................................................ 249 5.8.2.1 ProgString_1 ............................................................................................................................... 249 5.8.2.2 ProgString_2 ............................................................................................................................... 249 3 5.8.2.3 ProgString_3 ............................................................................................................................... 250 5.8.2.4 ProgString_4 ............................................................................................................................... 250 5.8.2.5 ProgString_5 ............................................................................................................................... 251 5.8.2.6 ProgString_6 ............................................................................................................................... 251 5.8.2.7 ProgString_7 ............................................................................................................................... 252 5.8.2.8 ProgString_8 ............................................................................................................................... 252 Anexo 6.4 Solução da Lista: Listas Lineares .............................................................................................. 253 6.4.1 ProgLista_1 ................................................................................................................................... 253 6.4.2 ProgLista_2 ................................................................................................................................... 254 6.4.3 ProgLista_3 ................................................................................................................................... 254 6.4.4 ProgLista_4 ................................................................................................................................... 255 6.4.5 ProgLista_5 ................................................................................................................................... 255 6.4.6 ProgLista_6 ................................................................................................................................... 256 6.4.7 ProgLista_7 ................................................................................................................................... 257 6.4.8 ProgLista_8 ................................................................................................................................... 257 6.4.9 ProgLista_9 ................................................................................................................................... 258 6.4.10 ProgLista_10 ............................................................................................................................... 259 6.4.11 ProgLista_11 ............................................................................................................................... 259 6.4.12 ProgLista_12 ............................................................................................................................... 260 6.4.13 ProgLista_13 ............................................................................................................................... 260 6.4.14 ProgLista_14 ............................................................................................................................... 261 6.4.15 ProgLista_15 ............................................................................................................................... 262 Anexo 7.2 Solução da Lista: Mapas ........................................................................................................... 262 7.2.1 ProgMap_1 .................................................................................................................................... 262 7.2.2 ProgMap_2 .................................................................................................................................... 263 7.2.3 ProgMap_3 .................................................................................................................................... 263 7.2.4 ProgMap_4 .................................................................................................................................... 264 7.2.5 ProgMap_5 .................................................................................................................................... 264 Anexo 8.6 Solução da Lista: Arquivos (File) ............................................................................................. 264 8.6.1 ProgFile_1 ..................................................................................................................................... 264 8.6.2 ProgFile_2 ..................................................................................................................................... 265 8.6.3 ProgFile_3 ..................................................................................................................................... 266 8.6.4 ProgFile_4 ..................................................................................................................................... 266 8.6.5 ProgFile_5 ..................................................................................................................................... 267 8.6.6 ProgFile_6 ..................................................................................................................................... 268 8.6.7 ProgFile_7 ..................................................................................................................................... 269 8.6.8 ProgFile_8 ..................................................................................................................................... 269 8.6.9 ProgFile_9 ..................................................................................................................................... 270 8.6.10 ProgFile_10 ................................................................................................................................. 271 8.6.11 ProgFile_11 ................................................................................................................................. 271 8.6.12 ProgFile_12 ................................................................................................................................. 272 Lista de Figuras Figura 1: Estrutura de dados da classe Vetor .................................................................................... 8 Figura 2: Exemplo de Herança em java .............................................................................................. 40 Figura 3: Objetos gráficos: Linha e Retângulo ................................................................................. 50 Figura 4: LinkedList - Lista Encadeada Simples ................................................................................. 65 Figura 5: Representação gráfica de uma String ................................................................................ 90 Figura 6: Representação de uma Fila e uma Pilha .......................................................................... 108 Figura 7: Representação visual de um Deque ................................................................................. 118 Figura 8: Representação gráfica de uma Tabela Hash (Hashtable) .............................................. 131 Figura 9: Exemplo de um arquivo texto ........................................................................................... 138 Figura 10: Editor hexadecimal mostrando o arquivo texto ........................................................... 139 Figura 11: Editor hexadecimal mostrando o arquivo binário ........................................................ 139 4 Figura 12: Exemplo de MVC .............................................................................................................. 172 Figura 13: Exemplo de MVC .............................................................................................................. 176 Figura 14: Lista Encadeada Simples ................................................................................................. 182 Figura 15: Alocação de elementos na Memória RAM .................................................................... 183 Figura 16: Lista Duplamente Encadeada ......................................................................................... 193 Figura 17: Jogo Torre de Hanoi ....................................................................................................... 208 Figura 18: Jogo Quebra-Cabeças ..................................................................................................... 220 Lista de Tabelas Tabela 1: Tipos de Ícones .................................................................................................................... 53 Tabela 2: Comandos de formatação .................................................................................................. 53 Tabela 3: Especificadores de largura do campo .............................................................................. 54 Tabela 4: Lista de Container ................................................................................................................ 55 Tabela 5: Tipos de dados do Java ..................................................................................................... 172 Legenda de Cores Vermelho <enter>: Entrada de dados do programa Azul: Saída do programa (Resultado do teste do Programa) Verde: Texto em destaque Marinho: Código em Java Preto: Texto normal Preto: Método em destaque Itálico: Palavra em Inglês Negrito: Texto em destaque Sublinado: Observações 5 1. Projeto de Classes A seguir são descritas algumas características da orientação a objetos em Java. 1.1 Escrevendo uma classe em Java (Conceitos básicos) O paradigma orientado à objetos possui cinco componentes básicos: objetos (possuem atributos e métodos), mensagens (chamadas aos métodos), classes (tipo de dado), instâncias (criação de objetos de uma classe específica – new – alocação de memória) e métodos (funções definidas pelo programador que manipulam os atributos). Objetos, mensagens, classes, instâncias e métodos Objetos são entidades lógicas que contém atributos (dados armazenados em variáveis) e métodos (funções) que manipulam estes dados. Um objeto pode ser definido através de um tipo de dado chamado classe (class). Resumindo: a) Atributos: São as variáveis definidas/declaradas para cada objeto. b) Métodos: São as funções definidas pelo programador que servirão para manipular os atributos. c) Mensagens: São as chamadas dos métodos. d) Classe: É um tipo de dado definido por class. Uma classe não é um objeto, é sim uma descrição do objeto. e) Instância: Os objetos são instâncias de uma classe, ou seja, é criado um objeto pertencente a uma classe específica. O objeto pode responder chamadas dos métodos e armazenar informações nos atributos. Resumidamente, objetos são instâncias de classes que respondem as mensagens através dos métodos escritos pelo programador. Uma linguagem de programação orientada à objetos pode suportar ou implementar seis propriedades: abstração, encapsulamento, polimorfismo, herança, associação (quando uma classe possui atributos do tipo de outra classe - agregação e composição) e classes abstratas e concretas. 1.2 Tipos de Atributos São variáveis definidas e declaradas nas classes. Existem três tipos de atributos: Atributo do objeto: É individual para cada objeto, ou seja, cada objeto pode possuir um valor diferente; 6 Atributo da classe: É estático (static), ou seja, coletivo, igual para todos os objetos da classe; Atributo constante: Idêntico aos atributos da classe, somente não podem ser alterados por serem constantes (final). // --------------------------------------------------------------------------------------------------------------------------------------- Classe: Atributos.java package progatributos; public class Atributos { private int x; private static int y; private final int z = 3; // atributo do objeto (cada objeto tem o seu) // atributo da classe (todos tem igual, mas pode ser alterado) // atributo constante (todos os objetos tem o mesmo valor, não pode ser alterado Atributos(int x) { this.x = x; } public void setAtributoY(int y) { Atributos.y = y; // this.y = y; } public void exibeAtributos() { System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("z = " + z); System.out.println(); } // ----------------------------------------------------------------------------------------------------------- Programa Principal: ProgAtributos.java package progatributos; public class ProgAtributos { public static void main(String[] args) { Atributos atrib1 = new Atributos(1); Atributos atrib2 = new Atributos(3); Atributos atrib3 = new Atributos(5); atrib1.setAtributoY(7); // altera atributo Y e esta mudança vale para todos os objetos atrib1.exibeAtributos(); atrib2.exibeAtributos(); atrib3.exibeAtributos(); } } Resultado do Programa: x=1 y=7 z=3 x=3 y=7 z=3 x=5 y=7 z=3 Considere a seguinte estrutura de dados da Figura 1, onde há um vetor de “max” elementos e um atributo “n” que controla a quantidade de elementos presentes no vetor num dado momento. Esta estrutura é utilizada na classe Vetor definida a seguir. 7 Figura 1: Estrutura de dados da classe Vetor Programa Exemplo: Classe “Vetor”, que possui a estrutura de dados exibida na Figura 1, e que possui os seguintes atributos: private int n; private final int[] vetor; private final int max; // número de elementos no vetor // vetor que armazena os elementos // máximo número de elementos no vetor // -------------------------------------------------------------------------------------------------------------------------------------------- Classe: Vetor.java package progvetor; public class Vetor { // ------------------------------------- atributos da classe private int n; private final int[] vetor; private final int max; // ----------------------------------------- construtor Vetor(int numeroElementos) { max = numeroElementos; vetor = new int[max]; // alocação de max número de elementos n = 0; } // ----------------------------------------- add public void add(int valor) { if (n < max) { vetor[n] = valor; n++; } else { System.out.println("Erro: Excedeu Limite do Vetor"); } } // --------------------------------------- exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n; i++) { System.out.print(vetor[i] + ", "); } System.out.println("\b\b]"); // apaga o último espaço em branco e a última vírgula } // ‘\b’ retrocesso ou BackSpace // ---------------------------------------------------- numeroElementosVetor public int numeroElementosVetor() { return(n); } 8 } // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgVetor.java package progvetor; public class ProgVetor { public static void main(String[] args) { Vetor vetor = new Vetor(5); // 5 é o número de elementos no vetor estático da classe vetor.add(10); vetor.add(20); vetor.add(30); vetor.add(40); vetor.add(50); vetor.exibe(); vetor.add(60); vetor.exibe(); System.out.println("Total de Elementos: " + vetor.numeroElementosVetor()); } } Resultado do Programa: Vetor: [10, 20, 30, 40, 50] Erro: Excedeu Limite do Vetor Vetor: [10, 20, 30, 40, 50] Total de Elementos: 5 Tente implementar os seguintes métodos para a classe “Vetor”: int valor = vetor.del(); if (valor != -999) { System.out.println("Valor Excluído: " + valor); } else { System.out.println("ERRO: Vetor Vazio"); } vetor.exibe(); System.out.println("Total de Elementos: " + vetor.length()); int pri = vetor.primeiro(); System.out.println("Primeiro: " + pri); int ult = vetor.ultimo(); System.out.println("Último: " + ult); int elemento = 20; boolean flag = vetor.existe(elemento); if (flag) { System.out.println("Existe elemento: " + elemento); } else { System.out.println("Não Existe elemento 20"); } Resultado do Programa: Vetor: [10, 20, 30, 40, 50] Erro: Excedeu Limite do Vetor Vetor: [10, 20, 30, 40, 50] Total de Elementos: 5 Valor Excluído: 50 Vetor: [10, 20, 30, 40] Total de Elementos: 4 Primeiro: 10 Último: 40 Existe elemento: 20 9 Exemplo de classe (Lista) aonde os elementos são inseridos a partir da posição “zero” do vetor e há uma variável “n” que controla o número de elementos da lista. // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgLista.java package testalista; import java.util.Scanner; public class TestaLista { public static void main(String[] args) { final int SUCESSO = 0; final int CHEIA = -1; final int VAZIA = -2; final int EXCEDEU = -3; final int POSICAO = - 4; final int VALOR = -5; Scanner input = new Scanner(System.in); Lista lista = new Lista(7); String s; char op; do { do { int[] valores = lista.exibeLista(); int n = lista.numeroElementosLista(); exibeLista(n, valores); do { System.out.print("[I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: "); s = input.nextLine(); } while (s.isEmpty()); op = s.charAt(0); if (op == 'Q' || op == 'q') { System.exit(1); } } while (!"IiRrAaPpOoSsVv".contains(s)); //} while (!"IRAPOSV".equalsIgnoreCase(s)); switch (op) { case 'I': case 'i': System.out.print("Valor: "); s = input.nextLine(); Integer valor = Integer.parseInt(s); int erro = lista.insereLista(valor); ImprimeErro(erro); break; case 'R': case 'r': erro = lista.removeLista(); if (erro != 0) { System.out.println("Valor Removido: " + erro); } else { ImprimeErro(VAZIA); } break; case 'A': case 'a': lista.removeallLista(); break; case 'O': case 'o': System.out.print("Valor: "); s = input.nextLine(); valor = Integer.parseInt(s); int posicao = lista.procuraLista(valor); if (posicao != -5) { System.out.println("Posição: " + posicao); 10 } else { ImprimeErro(POSICAO); } break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); valor = lista.pesquisaLista(posicao); if (valor != -4) { System.out.println("Valor Pesquisado: " + valor); } else { ImprimeErro(VALOR); } break; case 'S': case 's': lista.sort(); break; case 'V': case 'v': lista.inverteLista(); break; } } while (true); } // -------------------------------------------------------- método estático static void exibeLista(int n, int[] valores) { System.out.print("Lista: "); if (n == 0) { System.out.print("Vazia"); } else { System.out.print("(" + n + ") "); for (int i = 0; i < n; i++) { System.out.print(valores[i] + " "); } } System.out.println(""); } static void ImprimeErro(int erro) { final String SUCESSO = "Okay, operação realizada com sucesso"; // 0 final String CHEIA = "ERRO: Lista Cheia"; // -1 final String VAZIA = "ERRO: Lista Vazia"; // -2 final String EXCEDEU = "Erro: Excedeu o Limite Máximo"; // -3 final String POSICAO = "Erro: Posição Inválida"; // -4 final String VALOR = "Erro: Valor não Encontrado"; // -5 switch (erro) { case 0: System.out.println(SUCESSO); break; case -1: System.out.println(CHEIA); break; case -2: System.out.println(VAZIA); break; case -3: System.out.println(EXCEDEU); break; case -4: System.out.println(POSICAO); break; case -5: System.out.println(VALOR); 11 break; default: System.out.println("Atenção: Erro Desconhecido"); break; } } } // Pesquisa -> Posição: 3 ----> Resultado: Valor: 30 ou ERRO: Não Encontrado // Procura -> Valor: 30 ---> Resultado: Posição: ?? ou ERRO: Não Encontrado // removeAll ---> Eliminar todos os valores // ---------------------------------------------------------------------------------------------------------- Classe: Lista.java package testalista; import java.util.Arrays; public class Lista { // ----------------------- atributos da classe private int n; private final int[] vetor; private final int max; // ----------------------- construtor Lista(int numeroMaxElementos) { n = 0; max = numeroMaxElementos; vetor = new int[max + 1]; } // ----------------------- métodos public int [] exibeLista() { return(vetor); } public int insereLista(int valor) { if (n < max) { vetor[n] = valor; n++; return(0); // SUCESSO } else { return(-3); // EXCEDEU } } public int removeLista() { int valor = vetor[n]; if (n > 0) { n--; return(valor); } else { return(-2); // VAZIA } } public void removeallLista() { n = 0; } public int procuraLista(int valor) { if (n != 0) { for (int i = 1; i < n; i++) { if (vetor[i] == valor) { return (i); } } } return (-5); // Valor não encontrado 12 } public int pesquisaLista(int posicao) { if (posicao >= 0 && posicao < n) { return (vetor[posicao]); } else { return (-4); // Posição Inválida } } public void sort() { Arrays.sort(vetor, 0, n); // início e fim } public void inverteLista() { int i = 0; for (int j = n-1; j >= n / 2; j--) { int temp = vetor[i]; vetor[i] = vetor[j]; i++; vetor[j] = temp; } } public int numeroElementosLista() { return(n); } } Resultado do Programa: Lista: Vazia [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> Valor: 100 <enter> Okay, operação realizada com sucesso Lista: (1) 100 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> Valor: 200 <enter> Okay, operação realizada com sucesso Lista: (2) 100 200 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> Valor: 300 <enter> Okay, operação realizada com sucesso Lista: (3) 100 200 300 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: Exemplo de classe (Lista) aonde os elementos são inseridos a partir da metade do vetor, podendo ser inserido pela esquerda ou direita. Note que a lista é centralizada sempre que necessário. // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgListaMetade.java package testalistametade; import java.util.Scanner; public class TestaListaMetade { public static void main(String[] args) { final int SUCESSO = 0; final int CHEIA = -1; final int VAZIA = -2; final int EXCEDEU = -3; final int POSICAO = -4; final int VALOR = -5; Scanner input = new Scanner(System.in); System.out.print("Número de Elementos: "); String s = input.nextLine(); 13 String r; int numeroElementos = Integer.parseInt(s); Lista lista = new Lista(numeroElementos); char op, ch = 'T'; do { do { int[] valores = lista.exibeLista(); int n = lista.numeroElementosLista(); int inic = lista.inicioLista(); int fim = lista.fimLista(); ExibeLista(n, inic, fim, valores); do { System.out.print("[I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: "); s = input.nextLine(); } while (s.isEmpty()); op = s.charAt(0); if (op == 'Q' || op == 'q') { System.exit(1); } if ("IiRr".contains(s)) { do { System.out.print("[E]squerda ou [D]ireita: "); r = input.nextLine(); ch = r.charAt(0); } while (!"EeDd".contains(r)); } } while (!"IiRrAaPpOoSsVv".contains(s)); //} while (!"IRAPOSV".equalsIgnoreCase(s)); switch (op) { case 'I': case 'i': System.out.print("Valor: "); s = input.nextLine(); Integer valor = Integer.parseInt(s); switch (ch) { case 'E': case 'e': lista.insereListaEsquerda(valor); break; case 'D': case 'd': lista.insereListaDireita(valor); break; } break; case 'R': case 'r': switch (ch) { case 'E': case 'e': valor = lista.removeListaEsquerda(); if (valor != VAZIA) { System.out.println("Valor Removido: " + valor); } else { ImprimeErro(VAZIA); } break; case 'D': case 'd': valor = lista.removeListaDireita(); if (valor != VAZIA) { System.out.println("Valor Removido: " + valor); } else { ImprimeErro(VAZIA); } break; } break; 14 case 'A': case 'a': lista.removeallLista(); break; case 'O': case 'o': System.out.print("Valor: "); s = input.nextLine(); valor = Integer.parseInt(s); int posicao = lista.procuraLista(valor); if (posicao != -1) { System.out.println("Posição: " + posicao); } else { ImprimeErro(POSICAO); } break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); valor = lista.pesquisaLista(posicao); if (valor != -1) { System.out.println("Valor Pesquisado: " + valor); } else { ImprimeErro(VALOR); } break; case 'S': case 's': lista.sort(); break; case 'V': case 'v': lista.inverteLista(); break; } } while (true); } // -------------------------------------------------------- método estático static void ExibeLista(int n, int inic, int fim, int[] valores) { System.out.print("Lista: "); if (n == 0) { System.out.print("Vazia"); } else { System.out.print("(" + n + ") "); for (int i = inic; i <= fim; i++) { System.out.print(valores[i] + " "); } } System.out.println(""); } static void ImprimeErro(int erro) { final String SUCESSO = "Okay, operação realizada com sucesso"; // 0 final String CHEIA = "ERRO: Lista Cheia"; // -1 final String VAZIA = "ERRO: Lista Vazia"; // -2 final String EXCEDEU = "Erro: Excedeu o Limite Máximo"; // -3 final String POSICAO = "Erro: Posição Inválida"; // -4 final String VALOR = "Erro: Valor não Encontrado"; // -5 switch (erro) { case 0: System.out.println(SUCESSO); break; case -1: System.out.println(CHEIA); 15 break; case -2: System.out.println(VAZIA); break; case -3: System.out.println(EXCEDEU); break; case -4: System.out.println(POSICAO); break; case -5: System.out.println(VALOR); break; default: System.out.println("Atenção: Erro Desconhecido"); break; } } } // Pesquisa -> Posição: 3 ----> Resultado: Valor: 30 ou ERRO: Não Encontrado // Procura -> Valor: 30 ---> Resultado: Posição: ?? ou ERRO: Não Encontrado // removeAll ---> Eliminar todos os valores // ---------------------------------------------------------------------------------------------------------- Classe: Lista.java package testalistametade; import java.util.Arrays; public class Lista { // ----------------------- atributos da classe private int n = 0; private int inic; private int fim; private final int[] vetor; private final int max; // ----------------------- construtor Lista(int numeroMaxElementos) { n = 0; max = numeroMaxElementos; inic = max / 2; fim = max / 2; vetor = new int[max]; } // ----------------------- métodos public int[] exibeLista() { //-------------------------- retirar depois System.out.print("Lista: "); if (n == 0) { System.out.print("Vazia"); } else { System.out.print("(" + inic + " | " + fim + ") "); for (int i = 0; i < max; i++) { System.out.print(vetor[i] + " "); } } System.out.println(""); // ---------------------------------------------------return (vetor); } public int insereListaDireita(int valor) { if (fim < max - 1) { if (n > 0) { fim++; 16 } vetor[fim] = valor; n++; return (0); // SUCESSO } else { if (centralizaLista()) { fim++; vetor[fim] = valor; n++; return (0); } return (-3); // EXCEDEU } } public int insereListaEsquerda(int valor) { if (inic > 0) { if (n > 0) { inic--; } vetor[inic] = valor; n++; return (0); // SUCESSO } else { if (centralizaLista()) { inic--; vetor[inic] = valor; n++; return (0); } return (-3); // EXCEDEU } } public int removeListaDireita() { if (n > 0) { int valor = vetor[fim]; fim--; n--; return(valor); } else { return(-2); } } public int removeListaEsquerda() { if (n > 0) { int valor = vetor[inic]; inic++; n--; return(valor); } else { return(-2); } } public void removeallLista() { n = 0; inic = max / 2; fim = max / 2; } public int procuraLista(int valor) { if (n != 0) { for (int i = inic; i <= fim; i++) { if (vetor[i] == valor) { return (i); } 17 } } return (-5); } public int pesquisaLista(int posicao) { if (posicao >= inic && posicao <= fim) { return (vetor[posicao]); } else { return (-4); } } public void sort() { Arrays.sort(vetor, inic, fim+1); // início e fim } public void inverteLista() { int i = inic; for (int j = fim; j >= inic + (fim - inic) / 2; j--) { int temp = vetor[i]; vetor[i] = vetor[j]; i++; vetor[j] = temp; } } public int numeroElementosLista() { return (n); } public int inicioLista() { return (inic); } public int fimLista() { return (fim); } private boolean centralizaLista() { int brancos = max - n; int deslocamentos = brancos / 2; if (deslocamentos < 1) { return (false); } if (fim == max - 1) { // desloca para esquerda int j = deslocamentos; for (int i = inic; i <= fim; i++) { vetor[j] = vetor[i]; j++; } inic = inic - deslocamentos - 1; fim = inic + n - 1; } else { // desloca para direita deslocamentos++; int j = fim + deslocamentos; for (int i = fim; i >= inic; i--) { vetor[j] = vetor[i]; j--; } fim = fim + deslocamentos; inic = inic + deslocamentos; } return (true); } } 18 Resultado do Programa: Lista: (5 | 6) 0 0 0 0 0 100 200 0 0 0 0 Lista: (2) 100 200 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 300 <enter> Lista: (5 | 7) 0 0 0 0 0 100 200 300 0 0 0 Lista: (3) 100 200 300 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 400 <enter> Lista: (5 | 8) 0 0 0 0 0 100 200 300 400 0 0 Lista: (4) 100 200 300 400 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 500 <enter> Lista: (5 | 9) 0 0 0 0 0 100 200 300 400 500 0 Lista: (5) 100 200 300 400 500 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 600 <enter> Lista: (5 | 10) 0 0 0 0 0 100 200 300 400 500 600 Lista: (6) 100 200 300 400 500 600 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 700 <enter> Lista: (2 | 8) 0 0 100 200 300 400 500 600 700 500 600 // Note, lista centralizada + lixo (verde claro) Lista: (7) 100 200 300 400 500 600 700 [I]nserir, [R]emover, remove[A]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: Uma linguagem de programação orientada à objetos pode suportar e/ou implementar seis (6) propriedades: abstração, encapsulamento, polimorfismo, herança, associação (agregação e composição) e classes abstratas e concretas. Abstração Objetos devem representar dados do mundo real. Encapsulamento (“encapsulação”) Os objetos possuem internamente atributos e métodos agrupados no mesmo local, onde os métodos manipulam os atributos. Esta característica protege os dados (atributos) de alterações indevidas, somente os membros da classe podem acessar os atributos, desde que eles sejam privados (private) ou protegidos (protected) (caso das classes derivadas, que herdam o direito de acesso aos atributos). Polimorfismo (grego: “muitas formas”) É a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja, “ ... uma interface, vários métodos ... ”. A característica de polimorfismo é utilizada principalmente em sobrecarga de métodos e operadores e classes abstratas, onde os métodos são declarados mas não definidos. Como tipos de polimorfismo tem-se: (a) Universal (inclusão [como em Java, por exemplo, List lista = new LinkedList();] 19 e paramétrico [templates como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). Java não possui sobrecarga de operadores. Sobrecarga de Operador: Permite sobrecarregar operadores para realizar diferentes tipos de operações; Sobrecarga de Método: Permite que um método retorne diferentes tipos de informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes de argumentos; Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de código. Classes concretas implementam todos os métodos e podem ser instanciadas. Herança É o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as características de outro (herança simples) ou vários objetos (herança múltipla). A classe base é chamada de superclasse, enquanto a classe derivada pode ser chamada de subclasse. Associação É um vínculo que permite que objetos de uma ou mais classes se relacionem entre si. Esta associação pode ser: unária (o vínculo é entre objetos da mesma classe), binária (vínculo ocorre entre dois objetos de classes diferentes) ou múltipla (vínculo ocorre entre mais de 2 objetos de classes diferentes). Cada associação pode possuir características de (a) cardinalidade ou multiplicidade (indica quantos objetos são possíveis em cada associação) e (b) navegação (existe a possibilidade dos objetos acessarem outros objetos da mesma associação). Uma associação pode ser de duas formas: agregação (relacionamento com características onde existe um grau menos intenso de coesão entre os elementos, pode haver um certo grau de independência) ou composição (relacionamento com características onde existe um alto grau de coesão e total grau de dependência entre os elementos). Classes Abstratas e Concretas 20 É criada para representar entidades e conceitos abstratos. Uma classe abstrata é sempre uma superclasse ou classe base que não possui instâncias. Ela define apenas o modelo (como um template em C++) para uma funcionalidade e fornece uma implementação incompleta chamada de parte genérica sendo compartilhada por um conjunto de classes derivadas ou subclasses. Classes derivadas completam as funcionalida-des da classe abstrata anexando um comportamento específico. Classes abstratas possuem métodos abstratos. Esses métodos são implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento específico. O método abstrato define apenas a assinatura do método não contendo nenhum código. Classes concretas implementam seus métodos e permitem instanciar objetos. Classes concretas não possuem métodos abstratos quando são classes derivadas de uma classe abstrata. Vantagens da Orientação à Objetos: (a) reutilização de código, (b) proteção aos dados; (c) organização ou estruturação dos dados em forma de classes e objetos; (d) sobrecarga de métodos e de operadores; (e) criação de pacotes de classes; (f) ter um conjunto de pacotes pré-definidos (api’s: java2d, java3d, swing, awt, etc) e (g) permitir ao desenvolvedor criar seus próprios pacotes. API: Application Programming Interface ou Interface de Programação de Aplicativos. É um conjunto de padrões de programação que permitem a construção de aplicativos. Em Java, o programador pode criar suas próprias classes. Uma classe possui duas partes distintas: atributos (variáveis) e métodos (funções ou procedimentos) que manipulam estes atributos. 1.3 Sobrecarga de Métodos Java permite que métodos estáticos (e construtores) sejam sobrecarregados, desta forma, o retorno, número de argumentos ou mesmo o tipo de dados dos argumentos podem ser diferentes. Dependendo da chamada do método, o Java identifica qual método (ou construtor) sobrecarregado deve ser executado. Teoricamente, é uma especificação que pode ter várias implementações com características diferentes. // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgSobreCarga.java package progsobrecarga; public class ProgSobreCarga { public static void main(String[] args) { imprime("Pelotas-RS"); imprime(123.45); imprime(123.45f); imprime(123); imprime('A'); } static void imprime(String s) { System.out.println("String: " + s); } static void imprime(Double d) { System.out.println("Double: " + d); 21 } static void imprime(Float f) { System.out.println("Float: " + f); } static void imprime(Integer i) { System.out.println("Inteiro: " + i); } static void imprime(Character ch) { System.out.println("Caracter: " + ch); } } Resultado do Programa: String: Senac-RS Double: 123.45 Float: 123.45 Inteiro: 123 Caracter: A // -------------------------------------------------------------------------------------------------- Programa Principal: ProgPolimorfismo.java package progpolimorfismo; public class ProgPolimorfismo { public static void main(String[] args) { pixel(1, 2); pixel(1, 2, 3); pixel(1.0, 2.0, 3.0); pixel('A', 'B', 'C'); } public static void pixel(int x, int y) { System.out.printf("x = %d | y = %d\n", x, y); } public static void pixel(int x, int y, int z) { System.out.printf("x = %d | y = %d | z = %d\n", x, y, z); } public static void pixel(double x, double y, double z) { System.out.printf("x = %.2f | y = %.2f | z = %.2f\n", x, y, z); } public static void pixel(char x, char y, char z) { System.out.printf("x = %c | y = %c | z = %c\n", x, y, z); } } Resultado do Programa: x=1|y=2 x=1|y=2|z=3 x = 1,00 | y = 2,00 | z = 3,00 x=A|y=B|z=C 1.4 Referência this 22 Em Java, quando um método de uma classe é chamado, é passado automaticamente um argumento que é uma referência para o objeto que gerou a chamada. Esta referência é chamada this, ou seja, a referência this referencia o objeto que chamou o método. Cada objeto tem acesso a uma referência a ele próprio, chamada this. Esta referência faz referências aos atributos e métodos de um objeto. Programa exemplo: Utilização da referência this em uma classe. // ------------------------------------------------------------------------------------------------------------------------------------- Classe: Data.java package progdata; import java.text.DecimalFormat; public class Data { // ------------------------------------- atributos da classe private int dia, mes, ano; // ------------------------------------------------ construtor Data(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; } // ------------------------------------------- sobrecarga do método toString public String toString() { DecimalFormat form = new DecimalFormat("00"); String data = "Data: " + form.format(dia) + "/" + form.format(mes) + "/" + ano; return (data); } } // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgData.java package progdata; public class ProgData { public static void main(String[] args) { Data data = new Data(5, 8, 2014); System.out.println(data); } } Resultado do Programa: Data: 05/08/2014 Solução do programa proposto acima: Classe “Vetor” e seus métodos. // -------------------------------------------------------------------------------------------------------------------------------------- Classe: Vetor.java package progvetor1; public class Vetor { // --------------------------------------------- atributos da classe private final int[] vetor; private int n; private final int max; 23 // ---------------------------------------------- construtor Vetor(int numeroElementos) { max = numeroElementos; vetor = new int[max]; n = 0; } // ----------------------------------------------- add public void add(int valor) { if (n < max) { vetor[n] = valor; n++; } else { System.out.println("Erro: Excedeu Limite do Vetor"); } } // ------------------------------------------------ del public int del() { if (n != 0) { int valor = vetor[n - 1]; n--; return (valor); } else { System.out.println("Erro: Vetor Vazio"); return (-999); } } // ------------------------------------------------- length public int length() { return (n); } // ------------------------------------------------- primeiro public int primeiro() { if (n != 0) { return (vetor[0]); } else { return (-999); } } // -------------------------------------------------- ultimo public int ultimo() { int ultimo = n - 1; if (n != 0) { return (vetor[ultimo]); } else { return (-999); } } // ----------------------------------------------------- existe public boolean existe(int elemento) { for (int i = 0; i < n; i++) { if (elemento == vetor[i]) { return (true); } } return (false); } // ----------------------------------------------------- exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n; i++) { 24 System.out.print(vetor[i] + ", "); } System.out.println("\b\b]"); } // ------------------------------------------------------ numeroElementosVetor public int numeroElementosVetor() { return (n); } } // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgVetor1.java package progvetor1; public class ProgVetor1 { public static void main(String[] args) { Vetor vetor = new Vetor(5); // 5 é o número de elementos do vetor estático da classe vetor.add(10); vetor.add(20); vetor.add(30); vetor.add(40); vetor.add(50); vetor.exibe(); vetor.add(60); vetor.exibe(); System.out.println("Total de Elementos: " + vetor.numeroElementosVetor()); int valor = vetor.del(); if (valor != -999) { System.out.println("Valor Excluído: " + valor); } else { System.out.println("ERRO: Vetor Vazio"); } vetor.exibe(); System.out.println("Total de Elementos: " + vetor.length()); int primeiro = vetor.primeiro(); System.out.println("Primeiro: " + primeiro); int ultimo = vetor.ultimo(); System.out.println("Último: " + ultimo); int elemento = 20; boolean flag = vetor.existe(elemento); if (flag) { System.out.println("Existe elemento: " + elemento); } else { System.out.println("Não Existe elemento 20"); } } } 1.5 Lista de exercícios: Classes 1.5.1 Dado o seguinte programa principal, implemente a classe “Circulo” e seus métodos: // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgCirculo.java package progcirculo; public class ProgCirculo { public static void main(String[] args) { Circulo circ = new Circulo(); circ.setRaio(3); circ.calculaArea(); double area = circ.getArea(); 25 System.out.printf("Área: %.2f\n", area); } } Observação: area = pi . raio2 onde pi é 3.1416 Círculo double area, raio setRaio calculaArea getArea Diagrama de classe Resultado do Programa: Área: 28,27 1.5.2 Dado o seguinte programa principal, implemente a classe “PesoIdeal” e seus métodos: // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgPeso.java package progpeso; public class ProgPeso { public static void main(String[] args) { PesoIdeal piHomem = new PesoIdeal('H', 1.67); PesoIdeal piMulher = new PesoIdeal('m', 1.65); piHomem.calculaPesoIdeal(); System.out.printf("Peso Ideal Homem: %.2f\n", piHomem.getPesoIdeal()); piMulher.calculaPesoIdeal(); System.out.printf("Peso Ideal Mulher: %.2f\n", piMulher.getPesoIdeal()); } } Resultado do Programa: Peso Ideal Homem: 63,41 Peso Ideal Mulher: 57,77 Cálculo do Peso Ideal: PIH = 72,7 x altura – 58 e PIM = 62,1 x altura – 44,7 PesoIdeal double altura, pesoIdeal char sexo calculaPesoIdeal getPesoIdeal Diagrama de classe 1.5.3 Dado o seguinte programa principal, implemente a classe “CPF” e seus métodos: // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgValidaCPF.java package progvalidacpf; public class ProgValidaCPF { public static void main(String[] args) { String s = "123456789"; CPF cpf = new CPF(s); int digitoVerificador = cpf.verificaCPF(); System.out.printf("Digito verificador: %02d\n", digitoVerificador); System.out.printf("CPF: %s-%02d\n", s , digitoVerificador); } } 26 Resultado do Programa: Digito verificador: 09 CPF: 123456789-09 CPF String cpf int digito verificaCPF Diagrama de classe Como calcular os Dígitos do CPF: Entrada: CPF: 123456789 1) Primeiramente pega-se os dígitos da base do CPF e se faz a soma da multiplicação individual dos dígitos, iniciando por 10 e indo até 2 como exemplificado abaixo: 1 2 3 4 5 6 7 8 9 x x x x x x x x x 10 9 8 7 6 5 4 3 2 -- -- -- -- -- -- -- -- -10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210 2) O valor do primeiro dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado conforme vê-se a seguir: 11 - (210 % 11) = 10 3) O cálculo do segundo dígito é feito da mesma forma que o primeiro, porém com os 9 dígitos da base do CPF e o primeiro dígito verificador encontrado, iniciando por 11 e indo até 2. 1 2 3 4 5 6 7 8 9 0 x x x x x x x x x x 11 10 9 8 7 6 5 4 3 2 -- -- -- -- -- -- -- -- -- -11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 = 255 4) O valor do segundo dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado conforme vê-se a seguir: 11 - (255 % 11) = 9 Saída: CPF válido é 123.456.789-09 ou 123456789-09 1.5.4 Dado o seguinte programa, implemente a classe “DiaSemana” e seus métodos: // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgDiaSemana.java package progdiasemana; public class ProgDiaSemana { public static void main(String[] args) { DiaSemana dia = new DiaSemana(10, 2, 1962); dia.verificaDiaSemana(); dia.exibeDiaSemana(); } } Resultado do Programa: Dia da Semana: Sábado DiaSemana 27 int dia, mes, ano String semama verificaDiaSemana exibeDiaSemana Diagrama de classe Como calcular o Dia da Semana: Deve-se calcular o Dia do Século: Para qualquer cálculo com datas é essencial que se disponha do Dia do Século para a(s) data(s) em questão. O Dia do Século é o número de dias decorridos desde o início do século (1º de janeiro de 1901) até a data em questão. Se usa como referência 1901 porque a maioria das datas com as quais se trabalha ainda são do século passado. Lá por 2040 ou mais poderá se mudar para 2001. A fórmula (válida para datas entre 1901 e 2099) é a seguinte: numeroDias = (ano - 1901) * 365 + (ano - 1901) DIV 4 + dia + (mês - 1) * 31 - [(mês * 4 + 23) DIV 10] * [(mês + 12) DIV 15] + [(4 ano MOD 4) DIV 4] * [(mês + 12) DIV 15] Dados de Teste: Dia: 10 Mês: 2 Ano: 1962 numeroDias = 22321 (para a data acima) Onde: DIV é a divisão inteira e MOD é o resto inteiro da divisão Verificação do Dia da Semana: Para saber o diaSemana basta dividir o numeroDias por 7 e entrar com o resto inteiro da divisão na tabela abaixo: 0 Segunda 1 Terça 2 Quarta 3 Quinta 4 Sexta 5 Sábado 6 Domingo Resultado do Programa: (Saída) 10/02/1962 é um(a) Sábado Observação: DIV é divisão inteira de dois números e MOD é o resto inteiro da divisão de dois números. 1.5.5 Dado o seguinte programa principal, implemente a classe Data e seus métodos: // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgTestData.java package progtestdata; public class ProgTestData { public static void main(String[] args) { Data data = new Data(); data.setData(25, 8, 2014); data.extenso(); } } Resultado do Programa: Data: 25 de agosto de 2014 Data int dia, mes, ano setData extenso 28 Diagrama de classe 1.5.6 Implemente os métodos forcaBruta e bubleSort na classe “Vetor” vista anteriormente (Fonte: ProgVetor). // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgVetorSort.java package progvetorsort; public class ProgVetorSort { public static void main(String[] args) { Vetor vetor = new Vetor(5); vetor.add(40); vetor.add(20); vetor.add(30); vetor.add(50); vetor.add(10); vetor.exibe(); vetor.add(60); vetor.exibe(); vetor.forcaBruta(); vetor.exibe(); vetor.bubbleSort(); vetor.exibe(); } } Resultado do Programa: Vetor: [40 20 30 50 10] ERRO: Excedeu o Limite do Vetor Vetor: [40 20 30 50 10] Vetor: [10 20 30 40 50] Vetor: [10 20 30 40 50] 1.5.7 Dado o seguinte programa principal, implemente a classe “Pessoa” e seus métodos. // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoa.java package progpessoa; public class ProgPessoa { public static void main(String[] args) { Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa(); Pessoa p3 = new Pessoa(); p1.setDados("Paulo Roberto", 1962, 'm'); p2.setDados("Renato Luis", 1965, 'm'); p3.setDados("Francisco Carlos", 1959, 'm'); p1.calculaIdade(); p2.calculaIdade(); p3.calculaIdade(); p1.exibePessoa(); p2.exibePessoa(); p3.exibePessoa(); } } Resultado do Programa: Nome: Paulo Roberto Idade: 52 ano(s) Sexo: Masculino 29 Nome: Renato Luis Idade: 49 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 55 ano(s) Sexo: Masculino Pessoa String nome int ano int idade char sexo setDados calculaIdade exibePessoa Diagrama de classe 1.5.8 Dado o seguinte programa principal, implemente a classe “Pessoa” e seus métodos. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoa2.java package progpessoa2; public class ProgPessoa2 { public static void main(String[] args) { Pessoa [] pessoa = new Pessoa[3]; pessoa[0] = new Pessoa(); pessoa[0].setDados("Paulo Roberto", 1962, 'm'); pessoa[0].calculaIdade(); pessoa[0].exibePessoa(); pessoa[1] = new Pessoa(); pessoa[1].setDados("Renato Luis", 1965, 'm'); pessoa[1].calculaIdade(); pessoa[1].exibePessoa(); pessoa[2] = new Pessoa(); pessoa[2].setDados("Francisco Carlos", 1959, 'm'); pessoa[2].calculaIdade(); pessoa[2].exibePessoa(); } } Resultado do Programa: Nome: Paulo Roberto Idade: 52 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 49 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 55 ano(s) Sexo: Masculino Pessoa String nome int ano int idade char sexo setDados calculaIdade exibePessoa Diagrama de classe 30 1.5.9 Dado o seguinte programa principal, implemente a classe “Pessoa” e seus métodos. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoas.java package progpessoas; public class ProgPessoas { public static void main(String[] args) { Pessoa pessoa = new Pessoa(7); pessoa.insereDados("Beatriz", 11); pessoa.insereDados("Debora", 13); pessoa.insereDados("Fátima", 15); pessoa.insereDados("Geni", 16); pessoa.insereDados("Carla", 12); pessoa.insereDados("Eva", 14); pessoa.insereDados("Ana", 10); pessoa.exibeDados(); pessoa.sort(); pessoa.exibeDados(); } } Resultado do Programa: Lista de Pessoas Nome: Beatriz Nome: Debora Nome: Fátima Nome: Geni Nome: Carla Nome: Eva Nome: Ana Lista de Pessoas Nome: Ana Nome: Beatriz Nome: Carla Nome: Debora Nome: Eva Nome: Fátima Nome: Geni Idade: 11 Idade: 13 Idade: 15 Idade: 16 Idade: 12 Idade: 14 Idade: 10 Idade: 10 Idade: 11 Idade: 12 Idade: 13 Idade: 14 Idade: 15 Idade: 16 Pessoa String [] nome int [] idade int n int max insereDados exibeDados sort Diagrama de classe 1.5.10 Dado o seguinte programa principal, implemente a classe “Agenda” e seus métodos. // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgAgenda.java package progagenda; public class ProgAgenda { public static void main(String[] args) { Agenda agenda = new Agenda(5); agenda.insereTelefone("Ana", "99811234"); agenda.insereTelefone("Beatriz", "99812345"); agenda.insereTelefone("Carla", "99813456"); 31 agenda.insereTelefone("Debora", "99814567"); agenda.insereTelefone("Eva", "99815678"); agenda.insereTelefone("Fátima", "99816789"); String fone = "99815678"; String nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usuário não Encontrado"); } fone = "99810123"; nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usuário não Encontrado"); } } } Resultado do Programa: ERRO: Excedeu limite da Agenda Nome: Eva - Telefone: 99815678 ERRO: Usuário não Encontrado Agenda String [] nome String [] fone int n int max insereTelefone consultaNome Diagrama de classe 1.5.11 Dado o seguinte programa principal, implemente a classe “Calculadora” e seus métodos. // -------------------------------------------------------------------------------------------------- Programa Principal: ProgCalculadora.java package progcalculadora; public class ProgCalculadora { public static void main(String[] args) { Calculadora calc = new Calculadora(); calc.entradaDados(); calc.operaCalculadora(); calc.exibeResultadoCalculadora(); } } Observação: A calculadora deve ter as seguintes operações: [+] adição [-] subtração [*] multiplicação [/] divisão [R] Raiz Quadrada [P] Potência [S] Seno [C] Cosseno [T] Tangente Calculadora 32 double x double y char operador double resposta entradaDados operaCalculadora exibeResultadoCalculadora Diagrama de classe Exemplo para testar o programa: Digite um Valor: 3 <enter> Operação [+-*/RrPpSsCcTt]: + <enter> Digite outro Valor: 4 <enter> Primeiro Valor: 3.0 Operador: [Adição] Segundo Valor : 4.0 Resultado da Operação: 7.0 Exemplo da definição de uma classe “Data”: // -------------------------------------------------------------------------------------------------------------------------------------------- Classe: Data.java package progtestadata; public class Data { // ------------------------------ atributos da classe private final int dia; private final int mes; private final int ano; // ----------------------------------------------------- construtor da classe public Data(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; } // ------------------------------------------------------------------------------------------ sobrecarga do método toString @Override // método “toString” sobrecarregado public String toString() { return("Data: " + this.dia + "/" + this.mes + "/" + this.ano); } } Programa exemplo: Programa que utiliza a classe “Data” definida anteriormente: // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgTestaData.java package progtestadata; public class ProgTestaData { public static void main(String[] args) { Data data = new Data(16, 3, 2010); // construtor irá receber 3 argumentos System.out.println(data); } } Resultado do Programa: Data: 16/3/2010 Exemplo da definição de uma classe “Calculadora”: 33 // -------------------------------------------------------------------------------------------------------------------- Classe: Calculadora.java package progcalculadora; import java.util.Scanner; public class Calculadora { // ------------------------ atributos da classe private double x; private double y; private double resultado; private char operador; // ------------------------ construtor // --------------------------------------- métodos públicos da classe public void entradaDados() { Scanner input = new Scanner(System.in); System.out.print("Digite um Valor: "); String s = input.nextLine(); s = s.replaceAll("[^0-9\\-.]", ""); // eliminação de letras digitadas de forma indevida x = Double.parseDouble(s); // que não podem ser convertidas para double do { System.out.print("Operação [+-*/RrPpSsCcTt]: "); s = input.nextLine(); operador = s.charAt(0); } while (!strChr("+-*/RrPpSsCcTt", operador)); if (strChr("+-*/Pp", operador)) { System.out.print("Digite outro Valor: "); s = input.nextLine(); s = s.replaceAll("[^0-9\\-.]", ""); // eliminação de letras digitadas de forma indevida y = Double.parseDouble(s); // que não podem ser convertidas para double } } public void operaCalculadora() { switch (operador) { case '+': resultado = add(); break; case '-': resultado = sub(); break; case '*': resultado = mul(); break; case '/': resultado = div(); break; case 'P': case 'p': resultado = pot(); break; case 'R': case 'r': resultado = raiz(); break; case 'S': case 's': resultado = sen(); break; case 'C': case 'c': resultado = cos(); break; case 'T': case 't': resultado = tan(); 34 break; } } public void exibeResultadoCalculadora() { String nomeOperador; System.out.println("Primeiro Valor: " + x); switch (operador) { case '+': nomeOperador = "Adição"; break; case '-': nomeOperador = "Subtração"; break; case '*': nomeOperador = "Multiplicação"; break; case '/': nomeOperador = ("Divisão"); break; case 'R': case 'r': nomeOperador = "Raiz Quadrada"; break; case 'P': case 'p': nomeOperador = "Potência"; break; case 'S': case 's': nomeOperador = "Seno"; break; case 'C': case 'c': nomeOperador = "Cosseno"; break; case 'T': case 't': nomeOperador = "Tangente"; break; default: nomeOperador = "Operador Inválido"; } System.out.printf("Operação realizada: [%s]\n", nomeOperador); System.out.println("Segundo Valor : " + y); System.out.println("Resultado da Operação: " + resultado); } // ------------------------------- métodos privados da classe private double add() { return (x + y); } private double sub() { return (x - y); } private double mul() { return (x * y); } private double div() { return (x / y); } private double pot() { return (Math.pow(x, y)); } private double raiz() { return (Math.sqrt(x)); } private double sen() { double rads = converteRadianos(x); return (Math.sin(rads)); } 35 private double cos() { double rads = converteRadianos(x); return (Math.cos(rads)); } private double tan() { double rads = converteRadianos(x); return (Math.tan(rads)); } // ----------------------------------------------------------------------- métodos estáticos da classe private static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } private static double converteRadianos(double graus) { double rads = Math.PI * graus / 180.0; return (rads); } } Programa exemplo: Utiliza a classe “Calculadora” e seus métodos definidos acima: // -------------------------------------------------------------------------------------------------- Programa Principal: ProgCalculadora.java package progcalculadora; public class ProgCalculadora { public static void main(String[] args) { Calculadora calc = new Calculadora(); // classe não recebe argumentos, não é necessário ela ter construtor calc.entradaDados(); calc.operaCalculadora(); calc.exibeCalculadora(); } } Programa exemplo: Mostra outra forma de utilizar a função “strChr” oriunda da linguagem de programação C e C++ utilizando o método “indexOf” do Java. // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgstrChr.java package progstrchr; import java.util.Scanner; public class ProgstrChr { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String nome, s; do { System.out.print("Nome: "); nome = entrada.nextLine(); int n = nome.length(); System.out.println(nome + " seu nome tem " + n + " caracteres"); do { 36 System.out.print("Continua [S/N]? " ); s = entrada.nextLine(); } while ("SsNn".indexOf(s) == -1); } while ("Nn".indexOf(s) == -1); // ou ... } while ("S".equalsIgnoreCase(s)); } } Exemplo para testar o programa: Nome: Paulo Roberto Gomes Luzzardi <enter> Paulo Roberto Gomes Luzzardi seu nome tem 28 caracteres Continua [S/N]? N <enter> Modificadores de Acesso: public: Os atributos e métodos tornam-se públicos, ou seja, qualquer outro método pode chamar ou utilizar estes atributos e/ou métodos. private: Somente os métodos da classe (membros) da classe podem chamar ou utilizar atributos ou métodos privados. protected: Utilizado em herança simples de classe (construção de subclasses), ou seja, uma subclasse herda todos os atributos e métodos da classe base (superclasse). Deixa acessível os atributos e/ou métodos para todas as outras classes (classe base) e subclasses (classe derivada). 37 2. Interface e Polimorfismo 2.1 Interface Uma interface é uma especificação que define um determinado conjunto de métodos que serão implementados nas classes desta interface. Para uma interface ser integralmente abstrata, seus métodos devem ser definidos como abstract e as variáveis por padrão são sempre constantes (static final). Uma interface é definida através da palavra reservada interface e uma classe para implementar uma interface usa a palavra reservada implements. Como Java não possui herança múltipla, a implementação de interfaces supram esta carência, como uma classe só pode herdar apenas uma vez, pode-se implementar inúmeras interfaces. As classes que implementam uma interface terão obrigatoriamente que ter todos os métodos da interface ou se transformar em uma classe abstrata. // ------------------------------------------------------------------------------------------------------------- Programa Principal: ProgInterface.java package proginterface; public class ProgInterface { public static void main(String[] args) { Homem homem = new Homem("Paulo Roberto"); Mulher mulher = new Mulher("Adriane Maria"); homem.exibeNome(); homem.exibeSexo(); mulher.exibeNome(); mulher.exibeSexo(); } } // ------------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package proginterface; public interface Pessoa { public abstract void exibeNome(); public abstract void exibeSexo(); } // ------------------------------------------------------------------------------------------------------------------------------ Classe: Homem.java package proginterface; public class Homem implements Pessoa { // --------------------------------------------- atributos da classe private final String nome; private static final char sexo = 'm'; Homem(String nome) { this.nome = nome; } @Override public void exibeNome() { // método “exibeNome” sobrecarregado 38 System.out.println("Homem: " + nome); } @Override // método “exibeSexo” sobrecarregado public void exibeSexo() { System.out.println("Sexo: Masculino -> " + sexo); } } // --------------------------------------------------------------------------------------------------------------------------------------- Classe: Mulher.java package proginterface; public class Mulher implements Pessoa{ // ------------------------------------------------- atributos da classe private final String nome; private static final char sexo = 'f'; Mulher(String nome) { this.nome = nome; } @Override // método “exibeNome” sobrecarregado public void exibeNome() { System.out.println("Mulher: " + nome); } @Override // método “exibeSexo” sobrecarregado public void exibeSexo() { System.out.println("Sexo: Feminino -> " + sexo); } } Resultado do Programa: Homem: Paulo Roberto Sexo: Masculino -> m Mulher: Adriane Maria Sexo: Feminino -> f // --------------------------------------------------------------------------------------------------------------- Programa Principal: ProgPixel.java package progpixel; public class ProgPixel { public static void main(String[] args) { Pixel2D pixel2D = new Pixel2D(3, 4); Pixel3D pixel3D = new Pixel3D(5, 6, 7); pixel2D.exibe(); pixel2D.setX(7); pixel2D.setY(8); pixel2D.exibe(); pixel3D.exibe(); pixel3D.setX(1); pixel3D.setY(2); pixel3D.setZ(3); pixel3D.exibe(); } } // ---------------------------------------------------------------------------------------------------------------------------------------- Interface: Pixel.java package progpixel; public interface Pixel { 39 public abstract void setX(int x); public abstract void setY(int y); public abstract void setZ(int z); public abstract void exibe(); } // ---------------------------------------------------------------------------------------------------------------------------------------- Classe: Pixel2D.java package progpixel; public class Pixel2D implements Pixel { private int x; private int y; Pixel2D(int x, int y) { this.x = x; this.y = y; } @Override public void setX(int x) { this.x = x; } @Override public void setY(int y) { this.y = y; } @Override public void setZ(int z) { } @Override public void exibe() { System.out.printf("x = %d | y = %d\n", x, y); } } // ---------------------------------------------------------------------------------------------------------------------------------------- Classe: Pixel3D.java package progpixel; public class Pixel3D implements Pixel { private int x; private int y; private int z; Pixel3D(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } @Override public void setX(int x) { this.x = x; } @Override public void setY(int y) { this.y = y; } @Override public void setZ(int z) { this.z = z; } 40 @Override public void exibe() { System.out.printf("x = %d | y = %d | z = %d\n", x, y, z); } } Resultado do Programa: x=3|y=4 x=7|y=8 x=5|y=6|z=7 x=1|y=2|z=3 2.2 Polimorfismo Conforme dito anteriormente, Polimorfismo, do grego: “muitas formas”, é a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja, “ ... uma interface, vários métodos ... ”. A característica de polimorfismo é utilizada principalmente em sobrecarga de métodos e operadores e classes abstratas, onde os métodos são declarados abstratos mas não definidos. Como tipos de polimorfismo tem-se: (a) Universal (inclusão [como em Java, por exemplo, List lista = new LinkedList();] e paramétrico [templates como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). Java não possui sobrecarga de operadores. Sobrecarga de Operador: Permite sobrecarregar operadores para realizar diferentes tipos de operações; Sobrecarga de Método: Permite que um método retorne diferentes tipos de informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes de argumentos; Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de código. Classes concretas implementam todos os métodos e podem ser instanciadas. Polimorfismo é o princípio no qual duas ou mais classes derivadas de uma mesma classe base podem implementar métodos que têm a mesma especificação, mas tem comportamentos diferentes, especializadas para cada uma das classes derivadas, utilizando uma referência a cada um dos objetos da classe base. Polimorfismo significa várias formas, onde um objeto pode se comportar de formas ligeiramente diferentes ao receber uma mensagem. Através do mecanismo de sobrecarga, dois métodos de uma classe 41 podem ter o mesmo nome, desde que suas implementações sejam diferentes, entretanto isso não é considerado polimorfismo em Java. No polimorfismo é necessário que os métodos tenham exatamente a mesma especificação, sendo utilizado um mecanismo de redefinição de métodos nas classes derivadas. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgPolimorfismo.java package progpolimorfismo; public class ProgPolimorfismo { public static void main(String[] args) { Pessoa homem = new Homem(1.64, 'm'); System.out.printf("Peso Ideal: %.2f (%s)\n", homem.calculaPesoIdeal(), homem.getSexo()); Pessoa mulher = new Mulher(1.64, 'f'); System.out.printf("Peso Ideal: %.2f (%s)\n", mulher.calculaPesoIdeal(), mulher.getSexo()); } } // ------------------------------------------------------------------------------------------------------- Classe Base: Pessoa.java package progpolimorfismo; abstract class Pessoa { protected Double altura; protected Character sexo; public abstract Double calculaPesoIdeal(); public abstract String getSexo(); } // ------------------------------------------------------------------------------------------------------- Classe Derivada: Homem.java package progpolimorfismo; class Homem extends Pessoa { Homem(Double altura, Character sexo) { this.altura = altura; this.sexo = sexo; } @Override public Double calculaPesoIdeal() { Double pesoIdeal = 72.7 * altura - 58.0; return (pesoIdeal); } @Override public String getSexo() { return("Masculino"); } } // ------------------------------------------------------------------------------------------------------- Classe Derivada: Mulher.java package progpolimorfismo; class Mulher extends Pessoa{ Mulher(Double altura, Character sexo) { this.altura = altura; this.sexo = sexo; } 42 @Override public Double calculaPesoIdeal() { Double pesoIdeal = 62.1 * altura - 44.7; return (pesoIdeal); } @Override public String getSexo() { return("Feminino"); } } Resultado do Programa: Peso Ideal: 61,23 (Masculino) Peso Ideal: 57,14 (Feminino) 2.3 Lista de Exercícios: Interface e Polimorfismo 2.3.1 Dado o seguinte programa principal: // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgInterface_1.java package proginterface_1; public class ProgInterface_1 { public static void main(String[] args) { Cardeal cardeal = new Cardeal("Cardeal", "Vermelho", "Cinza"); CardealBanhado cardealBanhado = new CardealBanhado("Cardeal Banhado", "Vermelho", "preto"); cardeal.exibeNome(); cardeal.exibeCores(); cardealBanhado.exibeNome(); cardealBanhado.exibeCores(); } } e a seguinte interface (Passaro): // ---------------------------------------------------------------------------------------------------------------------------------- Interface: Passaro.java package proginterface_1; public interface Passaro { public final int patas = 2; public abstract void exibeNome(); public abstract void exibeCores(); } // não pode ser private Complemente o código do programa criando as classes “Cardeal” e “CardealBanhado” para que o programa tenha o seguinte resultado na sua execução: Resultado do Programa: Nome do Pássaro: Cardeal Número de Patas: 2 Cor do Topete: Vermelho Cor do Corpo: Cinza Nome do Pássaro: Cardeal Banhado Número de Patas: 2 Cor do Topete: Vermelho Cor do Corpo: preto 43 2.3.2 Dado o seguinte programa principal: // -------------------------------------------------------------------------------------------------- Programa Principal: ProgInterface_2.java package proginterface_2; public class ProgInterface_2 { public static void main(String[] args) { Homem homem = new Homem(); Mulher mulher = new Mulher(); homem.setDados("Paulo Roberto", 52, 'm'); mulher.setDados("Adriane Maria", 45, 'f'); System.out.println(homem); System.out.println(mulher); } } e a seguinte interface (Pessoa): // ---------------------------------------------------------------------------------------------------------------------- Interface: Pessoa.java package proginterface_2; public interface Pessoa { public abstract void setDados(String nome, int idade, char sexo); public abstract String toString(); } Resultado do Programa: | Homem: Paulo Roberto | Idade: 52 | Sexo: MASCULINO | | Mulher: Adriane Maria | Idade: 45 | Sexo: FEMININO | 44 3. Herança em Java A ideia básica da herança é que uma classe herde as características de outra classe. Java possui apenas herança simples, ou seja, não permite herança múltipla. 3.1 Herança simples A herança simples permite que uma classe incorpore os atributos e métodos (características) de outra classe, ou seja, permite a construção de uma hierarquia de classes. Lembre: Java não possui herança múltipla, ou seja, tipo de herança em que uma classe derivada herda características de várias classes Base. O primeiro passo envolve a definição de uma classe base (superclasse) que define as características comuns à todos os objetos derivados desta classe. As classes oriundas da classe base são chamadas classes derivadas ou extensão da classe (subclasse) (Figura 2). Figura 2: Exemplo de Herança em Java Uma classe derivada herda todas as características da classe base e pode ter novas características adicionadas a ela. Uma classe derivada segue a seguinte diretriz em relação a classe base: classe_derivada é um(a) classe_base; Como verificar um caso de Herança: um cardial é um pássaro 45 // classe base: pássaro // classe derivada: cardial Especificadores de acesso: public (público) private (privado) Quem tem acesso à classe tem acesso também a qualquer membro público. É raro ter atributos públicos, mas é comum ter métodos públicos. Qualquer método tem acesso. Um membro privado não é acessível fora da classe, somente pelos membros da classe. A intenção é permitir que apenas quem escreve a classe possa usar esse membro. protected (protegido) O membro protegido é acessível à classe e a suas sub-classes (classes derivadas). A intenção é dar acesso aos programadores que estenderão sua classe. 3.2 Controle de acesso na definição de uma classe derivada Quando uma classe derivada é definida, ou seja, na definição de herança simples, seus membros (atributos e métodos) são declarados internamente e o acesso a estes pode ser público (public), privativo (private) ou protegido (protected). O acesso a membros protegidos é igual ao acesso a membros privativos, exceto para o acesso das classes derivadas da classe. A forma geral de especificar herança simples é: Especificador_de_acesso class nome_classe_derivada extends nomeclasse_base { // atributos da classe derivada // métodos da classe derivada } Quando uma classe herda as características de outra classe, todos os membros da classe base tornamse membros da classe derivada. O tipo de acesso da classe base dentro da classe derivada é determinado pelo especificador de acesso. Qualquer que seja o especificador de acesso, membros privativos da classe base continuam sendo propriedade privada da classe base, e não podem ser acessados por classes derivadas. Quando o especificador de acesso é public, todos os membros públicos da classe base tornam-se membros públicos da classe derivada, e os membros protegidos da classe base tornam-se membros protegidos da classe derivada. Esta é a diferença que existe entre membros privativos e membros protegidos. Quando o especificador de acesso é private, todos os membros públicos e protegidos da classe base tornam-se membros privativos da classe derivada, ou seja, a classe derivada não pode transferir seus privilégios de acesso a outras classes. Quando o especificador de acesso é protected, todos os membros públicos e protegidos da classe base tornam-se membros protegidos da classe derivada. 46 Programa exemplo: O objetivo deste programa, a seguir, é demonstrar a utilização de herança simples onde os atributos da classe base são privados. // ------------------------------------------------------------------------------------------------------------- Programa Principal: ProgHeranca.java package progheranca; public class ProgHeranca { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.setAtributos(1, 2); resp = objeto.soma(); System.out.println("Somador (x + y + z): " + objeto.somador(resp)); } } // ---------------------------------------------------------------------------------------------------------------------------- Classe Base: Base.java package progheranca; public class Base { private int x, y; // atributos privados public void setAtributos(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // -------------------------------------------------------------------------------------------------------------------- Classe Derivada: Derivada.java package progheranca; public class Derivada extends Base { private int z; Derivada(int x) { z = x; System.out.println("z = " + z); } public int somador(int soma) { // não é possível acessar x e y pois são privados da classe base return(soma + z); } } Resultado do Programa: z=3 x=1 y=2 Soma (x + y): 3 Somador (x + y + z): 6 Responda: Porque o atributo “z” é exibido primeiro? 47 Base int x int y setAtributos(int a, int b); soma(); Classe base (superclasse) Derivada int z int somador(int soma); Classe derivada (subclasse) 3.3 Tipos de acessos (especificadores de acesso) public (público): Todos os atributos da classe base são públicos na classe derivada. private (privado): Os atributos só podem ser acessados pelos métodos que fazem parte da classe. protected (protegido): Os atributos podem ser acessados pelos métodos de classes derivadas. Programa exemplo: O objetivo do próximo programa é demonstrar a utilização de herança simples tendo os atributos da classe base como protegidos. // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgHeranca2.java package progheranca2; public class ProgHeranca2 { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.setAtributos(1, 2); resp = objeto.soma(); System.out.println("Somador (x + y + z): " + objeto.somador(resp)); } } // --------------------------------------------------------------------------------------------------------------------------- Classe Base: base.java package progheranca2; public class Base { protected int x, y; // atributos protegidos public void setAtributos(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } public int soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // -------------------------------------------------------------------------------------------------------------------- Classe Derivada: Derivada.java package progheranca2; 48 public class Derivada extends Base { private int z; Derivada(int x) { z = x; System.out.println("z = " + z); } public int somador(int soma) { return(x + y + z); } // é possível acessar x e y pois são protegidos na classe base } Resultado do Programa: z=3 x=1 y=2 Soma (x + y): 3 Somador (x + y + z): 6 O comando super faz uma chamada formal ao construtor padrão da classe-pai. A seguir, o programa exemplo mostra a utilização do comando super. // -------------------------------------------------------------------------------------------------------------------- Classe Derivada: Derivada.java package progheranca3; public class Derivada extends Base { private int z; Derivada(int x) { super(10, 20); // chamada formal ao construtor da classe pai //super(); z = x; System.out.println("z = " + z); } public int somador(int soma) { return(x + y + z); // é possível acessar x e y pois são privados a classe base } protected void finalize() { // chamada do destrutor formal da classe System.out.println("Derivada: Final"); } } // ---------------------------------------------------------------------------------------------------------------------------- Classe Base: Base.java /* ---------------------------------------------------------------------------------------------------------------------------------------------------------------------A palavra-chave super permite acesso ao construtor da superclasse (base). Note que se não houver, no construtor da subclasse, nenhuma chamada explicita ao construtor da superclasse, o construtor sem argumento é chamado por default. Se for incluída uma chamada ao construtor da superclasse, ela deve ser o primeiro comando executado no construtor da subclasse. --------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ package progheranca3; public class Base { protected int x, y; Base() { this.x = 0; this.y = 0; // atributos protegidos // construtor default 49 System.out.println("x = " + this.x + " - y = " + this.y); } Base(int a, int b) { // construtor sobrecarregado this.x = a; this.y = b; System.out.println("x = " + this.x + " - y = " + this.y); } public void setAtributos(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); } protected int soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); } } // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgHeranca3.java package progheranca3; public class ProgHeranca3 { public static void main(String[] args) { Derivada objeto = new Derivada(3); int resp; objeto.setAtributos(1, 2); resp = objeto.soma(); System.out.println("Somador (x + y + z): " + objeto.somador(resp)); } } Resultado do Programa: x = 10 - y = 20 z=3 x=1 y=2 Soma (x + y): 3 Somador (x + y + z): 6 3.4 Lista de exercícios: Herança 3.4.1 Herança (primeiro) Dado os seguintes códigos em Java: // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgTestaHeranca.java package progtestaheranca; public class ProgTestaHeranca { public static void main(String[] args) { Cliente cliente = new Cliente("Paulo Roberto", "123.456.789-09", 1234.56); cliente.imprimePessoa(); cliente.imprimeCliente(); } 50 } // -------------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package progtestaheranca; public class Pessoa { protected String nome; protected String cpf; Pessoa() { this.nome = "xxxx"; this.cpf = "xxx.xxx.xxx-xx"; } Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; } public void imprimePessoa() { System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); } } // ------------------------------------------------------------------------------------------------------------------------------- Classe: Cliente.java package progtestaheranca; public class Cliente extends Pessoa { private double conta; Cliente(String nome, String cpf, double conta) { this.conta = conta; } public void imprimeCliente() { System.out.println("Conta: " + conta); } } Resultado esperado do programa: Nome: Paulo Roberto CPF: 123.456.789-09 Conta: 1234.56 Resultado real do programa: Nome: xxxx CPF: xxx.xxx.xxx-xx Conta: 1234.56 Que modificações devem ser feitas no código fonte para que o resultado do programa seja o esperado? 3.4.2 Herança (segundo) 51 Dado a classe base “Pessoa” e o programa principal “TestaHomem” (nada deve ser alterado nestas duas classes), construa as classes derivadas “Homem” e “Mulher” que contenha os atributos e métodos abaixo descritos: // -------------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package progtestahomem; public class Pessoa { protected double altura; protected char sexo; Pessoa() { this.altura = 0.0; this.sexo = 'g'; } Pessoa(double altura, char sexo) { this.altura = altura; this.sexo = sexo; } public void imprimePessoa() { System.out.println("Altura: " + altura); System.out.println("Sexo: " + sexo); } } Pessoa double altura char sexo imprimePessoa Classe base (superclasse) Homem double pesoIdealHomem calculaPesoIdealHomem imprimePesoIdealHomem Classe derivada (subclasse) Mulher double pesoIdealMulher calculaPesoIdealMulher imprimePesoIdealMulher Classe derivada (subclasse) // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgTestaHomem.java package progtestahomem; public class ProgTestaHomem { public static void main(String[] args) { Homem homem = new Homem(1.64, 'm'); Mulher mulher = new Mulher(1.59, 'f'); homem.calculaPesoIdealHomem(); homem.imprimePessoa(); homem.imprimePesoIdealHomem(); mulher.calculaPesoIdealMulher(); mulher.imprimePessoa(); mulher.imprimePesoIdealMulher(); } } Resultado do Programa: 52 Altura: 1.64 Sexo: m Peso Ideal (Homem): 61,23 Altura: 1.59 Sexo: f Peso Ideal (Mulher): 54,04 3.4.3 Herança (terceiro) Dados os seguintes códigos em Java (que não devem ser alterados de forma alguma): // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgTestaObjetos.java package progtestaobjetos; public class ProgTestaObjetos { public static void main(String[] args) { Linha linha = new Linha(1, 2, 3, 4); Retangulo retangulo = new Retangulo(1, 2, 3, 4); linha.imprimeLinha("Linha"); retangulo.imprimeRetangulo("Retângulo"); } } // -------------------------------------------------------------------------------------------------------------------------- Classe Base: Ponto.java package progtestaobjetos; public class Ponto { protected int x; protected int y; Ponto() { x = 0; y = 0; } Ponto(int x, int y) { this.x = x; this.y = y; } public void imprimePonto() { System.out.println("x = " + x + " - y = " + y); } } // ----------------------------------------------------------------------------------------------------------------------- Classe Derivada: Linha.java package progtestaobjetos; public class Linha extends Ponto { private final Ponto p1; private final Ponto p2; Linha (int xi, int yi, int xf, int yf) { p1 = new Ponto(xi, yi); p2 = new Ponto(xf, yf); } public void imprimeLinha() { p1.imprimePonto("p1"); p2.imprimePonto("p2"); } } 53 Implemente a classe derivada “Retangulo” (Figura 3) para que o programa funcione conforme o resultado do programa abaixo: Resultado do Programa: Linha: x=1-y=2 x=3-y=4 Retângulo: x=1-y=2 x=3-y=2 x=3-y=4 x=1-y=4 Figura 3: Objetos gráficos: Linha e Retângulo 54 4. Métodos de entrada e saída de dados A seguir, são mostrados basicamente três (3) métodos (maneiras/formas) que permitem fazer entrada de dados via teclado e saída de dados via monitor (tela) em Java. 4.1 Entrada de dados via teclado Scanner: A seguir é visto um programa exemplo onde a entrada de dados utilizando a classe Scanner e seus métodos. Programa exemplo: Mostra a entrada de dados, via teclado, em terminal de texto, utilizando a classe Scanner e alguns de seus métodos. // -------------------------------------------------------------------------------------------------------------- Programa Principal: ProgScanner.java package progscanner; import java.util.Scanner; public class ProgScanner { public static void main(String[] args) { Scanner input = new Scanner (System.in); System.out.print("Inteiro: "); String s = input.nextLine(); Integer x = Integer.parseInt(s); System.out.println("Valor: " + x); // lê uma string via teclado // converte a String para inteiro } } Exemplo para testar o programa: Inteiro: 7 <enter> Valor: 7 A seguir, o programa exemplo, mostra como fazer a leitura de int, float, double ou byte via teclado. // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgEntradaDados.java package progentradadados; import java.util.Scanner; public class ProgEntradaDados { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Digite um Inteiro: "); Integer inteiro = input.nextInt(); System.out.println("INTEIRO: " + inteiro + " -> SizeOf: " + sizeOf(inteiro) + " Byte(s)"); System.out.print("Digite um Float: "); Float numFloat = input.nextFloat(); System.out.println("FLOAT: " + numFloat + " -> SizeOf: " + sizeOf(numFloat) + " Byte(s)"); System.out.print("Digite um Double: "); Double numDouble = input.nextDouble(); 55 System.out.println("DOUBLE: " + numDouble + " -> SizeOf: " + sizeOf(numDouble) + " Byte(s)"); System.out.print("Digite um Byte: "); Byte numByte = input.nextByte(); System.out.println("BYTE: " + numByte + " -> SizeOf: " + sizeOf(numByte) + " Byte(s)"); } // ------------------------------------------------ métodos estáticos sobrecarregados public static int sizeOf(Boolean b) { return(1); } public static int sizeOf(Byte b) { return(1); } public static int sizeOf(Character c) { return(2); } public static int sizeOf(Short s) { return(2); } public static int sizeOf(Integer i) { return(4); } public static int sizeOf(Long l) { return(8); } public static int sizeOf(Float f) { return(4); } public static int sizeOf(Double d) { return(8); } } Exemplo para testar o programa: Digite um Inteiro: 123 <enter> INTEIRO: 123 -> SizeOf: 4 Byte(s) Digite um Float: 123,45 <enter> FLOAT: 123.45 -> SizeOf: 4 Byte(s) Digite um Double: 123,45 <enter> DOUBLE: 123.45 -> SizeOf: 8 Byte(s) Digite um Byte: 123 <enter> BYTE: 123 -> SizeOf: 1 Byte(s) Swing: A seguir, é visto um programa exemplo de entrada de dados utilizando a classe swing e seus métodos. Programa exemplo: A entrada de dados, via teclado, é feita em caixa de diálogo gráfica sobreposta a interface utilizando a classe swing e alguns dos seus métodos. // -------------------------------------------------------------------------------------------------------------- Programa Principal: ProgSwing.java package progswing; import javax.swing.*; // carrega toda o pacote swing public class ProgSwing { public static void main(String[] args) { 56 String s = JOptionPane.showInputDialog("Digite um Número: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); // JOptionPane.showMessageDialog(null, "Inteiro: " + x); // funciona também, pois os dois últimos argumentos podem ser suprimidos } } BufferReader e InputStreamReader: A seguir é visto um programa exemplo de entrada de dados utilizando o pacote “java.io” com as classes BufferReader e InputStreamReader e seus métodos. Programa exemplo: Entrada de dados via teclado em terminal de texto utilizando as bibliotecas BufferedReader e InputStreamReader e alguns dos seus métodos mais importantes. // ---------------------------------------------------------------------------------------------------------------- Programa Principal: ProgBuffer.java package progbuffer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ProgBuffer { public static void main(String[] args) throws IOException { BufferedReader userInput = new BufferedReader (new InputStreamReader(System.in)); System.out.print("Nome: "); String nome = userInput.readLine(); Integer n = nome.length(); System.out.println("Nome: " + nome + " tem " + nome.length() + " caracteres"); } } Resultado do Programa: Nome: Paulo Roberto <enter> Nome: Paulo Roberto tem 13 caracteres Observação: O programa, a seguir, serve para o pessoal que vai para a Maratona de Programação e precisa ler vários dados em apenas uma linha. // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgBufferReader.java package progbufferreader; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class ProgBufferReader { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readLine(); String [] partes = text.split(" "); int n = partes.length; 57 for (int i = 0;i < n;i++) { int t = Integer.parseInt(partes[i]); out.write("Valor: " + t); out.newLine(); out.flush(); } } } Entrada: 10 20 30 <enter> Saída: Valor: 10 Valor: 20 Valor: 30 4.2 Saída de dados via tela A seguir é visto um programa exemplo de saída de dados na tela utilizando o método System.out.print. Programa exemplo: Mostrando a saída de dados, via tela, utilizando os métodos System.out.print, System.out.println ou System.out.printf. // ---------------------------------------------------------------------------------------------------------------- Programa Principal: ProgPrint.java package progprint; import java.util.Scanner; public class ProgPrint { public static void main(String[] args) { Scanner entrada = new Scanner (System.in); String s; int x; System.out.print("Inteiro: "); s = entrada.nextLine(); x = Integer.parseInt(s); System.out.println("Valor: " + x); System.out.printf("Valor: %03d\n ", x); } } Entrada: Inteiro: 16 <enter> Saída: Valor: 16 Valor: 016 A seguir é visto um exemplo de saída de dados na tela utilizando a classe swing e seus principais métodos. Programa exemplo: Mostra a saída de dados, via tela, em caixa de diálogo gráfica sobreposta a interface usando a classe swing e alguns dos seus métodos. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgSwingSaida.java package progswingsaida; import javax.swing.*; // carrega toda a biblioteca swing 58 public class ProgSwingSaida { public static void main(String[] args) { String s; s = JOptionPane.showInputDialog("Digite um Número: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); } } Sintaxe: JOptionPane.showMessageDialog(null, “x = ” + x, “Título”, JOptionPane.PLAIN_MESSAGE); null significa que a mensagem será centralizada “x = “ + x significa que sairá na caixa de dialogo x = 5 (por exemplo) “Título” significa o título da caixa de diálogo JOptionPane.PLAIN_MESSAGE significa caixa sem ícone Tabela 1: Tipos de Ícones Tipo de Ícone Ícone de erro Ícone de informação “i” Ícone de advertência “!” Ícone de pergunta “?” Sem ícone Tipo de Mensagem JOptionPane.ERROR_MESSAGE JOptionPane.INFORMATION_MESSAGE JOptionPane.WARNING_MESSAGE JOptionPane.QUESTION_MESSAGE JOptionPane.PLAIN_MESSAGE 4.3 Saída formatada (System.out.printf) Como na linguagem de programação C, as saídas (impressões) na tela podem ser formatadas em Java utizando-se o método “System.out.printf”. Sintaxe: System.out.printf ("string de controle", lista de variáveis); String de controle: Formada pelos caracteres que o método imprime na tela, e pelos comandos de formatação (%c, %s, %d, %f) que definem a maneira como as variáveis serão impressas e caracteres especiais (\n, \t, ...). Tabela 2: Comandos de formatação Código %s %d %i %o %u %x %X %f %e %g %E %G %c %% Tipo String int int int int int int float float float float float char nada Formato String (vetor de caracteres) Inteiro decimal com sinal Inteiro decimal com sinal Inteiro octal sem sinal Inteiro decimal sem sinal Inteiro hexadecimal sem sinal (com a, b, c, d, e, f) Inteiro hexadecimal sem sinal (com A, B, C, D, E, F) Valor com sinal da forma [-]dddd.dddd Valor com sinal da forma [-]d.dddd e [+/-]ddd Valor com sinal na forma e ou f baseado na precisão do valor dado Mesmo que e, mas com E para expoente Mesmo que g, mas com E para expoente Um caracter O caracter % é impresso Flags (Bandeiras): (-) Alinha o resultado à esquerda. Preenche o restante do campo com brancos. Se não é colocado, alinha o resultado à direita e preenche o restante à esquerda com zeros ou brancos. 59 (+) O resultado sempre começa com o sinal + ou (#) Especifica que o argumento será impresso usando uma das formas alternativas Formas alternativas: 0 x ou X É colocado zeros (0) antes do argumento É colocado 0x (ou 0X) antes do argumento 60 Especificadores de largura do campo a ser impresso (exemplos): Tabela 3: Especificadores de largura do campo Prefixo %-+#0 %-+# %-+0 %-+ %-#0 %-# %-0 %%+#0 %+# %+0 %+ %#0 %# %0 % 6d +00555 +555 +00555 +555 000555 555 000555 555 +00555 +555 +00555 +555 000555 555 000555 555 6o 01053 01053 01053 1053 001053 01053 01053 1053 01053 01053 01053 1053 001053 01053 001053 1053 8x 0x0022b 0x22b 000022b 22b 0x00022b 0x22b 0000022b 22b 0x0022b 0x22b 000022b 22b 0x00022b 0x22b 0000022b 22b 10.2e +5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 05.50e+000 5.50e+000 05.50e+000 5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 +5.50e+000 05.50e+000 5.50e+000 05.50e+000 5.50e+000 10.2f +000005.50 +5.50 +000005.50 +5.50 0000005.50 5.50 0000005.50 5.50 +000005.50 +5.50 +000005.50 +5.50 0000005.50 5.50 0000005.50 5.50 4.4 Lista de Exercícios: Métodos de Entrada e Saída 4.4.1 Escreva um programa em Java que lê “n” valores inteiros (todos na mesma linha separados por um espaço em branco + <enter>). Imprima a quantidade de valores digitados, a média dos valores, o maior e o menor valor (conforme exemplo abaixo). Entrada: 10 20 30 40 50 60 70 80 90 <enter> Saída: Quantidade de Valores Digitados: 9 Média: 50.0 Maior: 90 Menor: 10 4.4.2 Escreva um programa em Java que recebe via teclado: número de elementos e os “n” elementos inteiros. O programa deve ordenar e imprimir na tela os valores em ordem crescente (conforme exemplos abaixo). Entrada: 7 <enter> 70 20 60 40 50 10 30 <enter> Saída: 10 20 30 40 50 60 70 Entrada: 7 <enter> 20 40 60 <enter> Saída: Erro na Entrada dos valores ou 61 5. Interfaces e Containers (Classes existentes em Java) Java possui diversas classes pré-existentes chamadas container. Um container ou coleção é simplesmente uma classe que agrupa múltiplos elementos em uma única unidade. As coleções são utilizadas para armazenar, recuperar e manipular dados agregados. A seguir pode-se ver algumas classes, coleções ou implementações existentes em Java (Tabela 4): Tabela 4: Lista de Container Container Descrição Array DList SList HashMap OrderedMap HashSet OrderedSet PriorityQueue Queue Stack Deque Array expansível Lista Duplamente Encadeada Lista Encadeada Simples fast associative container associative container fast set or multiset set or multiset array-based heap Fila (Interface) Pilha Fila Dupla (duas entradas e duas saídas) 5.1 Coleções (Collection FrameWork) Pacote: import java.util.*; Uma coleção é uma classe que representa um grupo de classes. Uma Collection Framework é uma arquitetura para representar e manipular coleções independentes dos detalhes de sua implementação. Uma coleção é composta de Interfaces e Implementações. 5.2 Interfaces Uma interface é uma especificação de uma classe, ou seja, é um modelo para classes desta interface. Cada classe de uma interface implementa os métodos de uma forma diferente do modelo da interface. 62 Interfaces e suas Implementações (apenas as principais implementações) Sets (Conjuntos): Não aceitam valores repetidos, ou seja, os valores armazenados no conjunto são únicos: o HashSet: É o mais rápido, usando uma HashTable, onde seus elementos não são ordenados; o LinkedHashSet: Os elementos continuam na ordem que são inseridos; o TreeSet: Implementa um algoritmo conhecido por red-black tree, ou seja, uma árvore rubronegra. Lists (Listas): o Vector: Classe obsoleta que implementa um vetor dinâmico, ou seja, não é necessário especificar o tamanho do vetor (usa uma lista encadeada simples); o Stack: Implementa uma pilha dinâmica; o LinkedList: Implementa uma lista encadeada simples, ou seja, uma lista dinâmica; o ArrayList: Implementa um vetor dinâmico, ou seja, não é necessário especificar o tamanho do vetor (usa uma lista encadeada simples). Queue (Filas): Implementa uma fila dinâmica através de uma lista encadeada simples. o LinkedList: Lista encadeada simples. Maps (Mapas): Contém chaves + valores, onde cada valor tem uma chave atrelada a ele. o HashTable: Mapa em ordem ascendente; o HashMap: Mapa em ordem ascendente; o LinkedHashMap: Mapa em ordem de inclusão; o TreeMap: Mapa em ordem ascendente. A seguir são descritos alguns destes elementos: 5.3 Vector (Vetor) (Classe Obsoleta) import java.util.Vector; A classe Vector é utilizada para armazenar elementos em uma estrutura similar a um vetor. Esta classe permite armazenar elementos dinamicamente, ou seja, uma lista de elementos sem limite de tamanho pré-definido. O único tamanho a ser respeitado é a área de memória livre na memória RAM. A seguir são descritos os principais métodos da classe Vector. Sintaxe: void add(int posição, Object objeto); Insere o objeto na posição do Vetor. Sintaxe: boolean add(Object objeto); Anexa o objeto no final do Vetor. Sintaxe: boolean addAll(Collection coleção); Anexa todos os elementos da coleção no final do Vetor, na ordem que eles são retornados pelo iterador da coleção. 63 Sintaxe: boolean addAll(int posição, Collection coleção); Insere todos os elementos na coleção no Vetor na posição. Sintaxe: void addElement(Object objeto); Adiciona o objeto no fim do Vetor, aumentando seu tamanho em um. Sintaxe: int capacity(); Retorna a capacidade corrente do Vetor. Sintaxe: void clear(); Remove todos os elementos do Vetor. Sintaxe: Object clone(); Retorna uma cópia do Vetor. Sintaxe: boolean contains(Object objeto); Testa se um objeto é um componente do Vetor. Sintaxe: boolean containsAll(Collection coleção); Retorna true se o Vetor contém todos os elementos da coleção. Sintaxe: void copyInto(Object[] array); Copia os componentes do Vetor para o array. Sintaxe: Object elementAt(int posição); Retorna o componente armazenado na posição. Sintaxe: Enumeration elements(); Retorna uma enumeração dos componentes do Vetor. Sintaxe: void ensureCapacity(int capacidadeMinima); Aumenta a capacidade do Vetor para armazenar o número de componentes dado pelo argumento capacidadeMinima. Sintaxe: boolean equals(Object objeto); Compara (igualdade) o objeto com os elementos do Vetor. Sintaxe: Object firstElement(); Retorna o primeiro elemento (item de posição 0) do Vetor. Sintaxe: Object get(int posicao); Retorna o elemento armazenado na posição do Vetor. Sintaxe: int hashCode(); Retorna o código hash do Vetor. Sintaxe: int indexOf(Object objeto); Procura e retorna a posição da primeira ocorrência de um elemento, testando a igualdade pelo método “equals”. Retorna -1 se não houver o objeto. Sintaxe: int indexOf(Object objeto, int posicao); Procura e retorna a posição da primeira ocorrência do objeto, começando a busca pela posição, e testando pela igualdade usando o método “equals”. Sintaxe: void insertElementAt(Object objeto, int posicao); Insere o objeto como um componente no Vetor na posição. Sintaxe: boolean isEmpty(); Testa se o Vetor não tem componentes, ou seja, se está vazia (true) ou não (false). Sintaxe: Object lastElement(); Retorna o último componente do Vetor. Sintaxe: int lastIndexOf(Object objeto); Retorna a posição da última ocorrência do objeto no Vetor. Sintaxe: int lastIndexOf(Object objeto, int posição); Retorna a posição da última ocorrência do objeto no Vetor, começando na posição. 64 Sintaxe: Object remove(int posição); Remove o elemento da posição no Vetor. Sintaxe: boolean remove(Object objeto); Remove a primeira ocorrência do objeto no Vetor, se o Vetor não contém o elemento, ele não é alterado. Sintaxe: boolean removeAll(Collection coleção); Remove do Vetor todos os elementos que contém a coleção. Sintaxe: void removeAllElements(); Remove todos os elementos do Vetor e seta o tamanho em zero. Sintaxe: boolean removeElement(Object objeto); Remove a primeira ocorrência do objeto do Vetor. Sintaxe: void removeElementAt(int posição); Deleta o elemento na posição. Sintaxe:protected void removeRange(int fromIndex, int toIndex); Remove da lista todos os elementos escolhidos entre o “fromIndex” (inclusive) e “toIndex” (exclusive). Sintaxe: boolean retainAll(Collection coleção); Mantém somente os elementos do Vetor que contém a coleção. Sintaxe: Object set(int posição, Object objeto); Troca o elemento da posição do Vetor com o elemento. Sintaxe: void setElementAt(Object objeto, int posição); Seta o objeto na posição do Vetor pelo objeto especificado. Sintaxe: void setSize(int newSize); Seta o tamanho do Vetor. Sintaxe: int size(); Retorna o número de elementos do Vetor. Sintaxe: List subList(int fromIndex, int toIndex); Retorna uma lista da porção da Lista entre “fromIndex” (inclusive) e “toIndex” (exclusive). Sintaxe: Object[] toArray(); Retorna um array contendo todos os elementos no Vetor. Sintaxe: Object[] toArray(Object[] objeto); Retorna um array contendo todos os elementos no Vetor. Sintaxe: String toString(); Retorna uma string do Vetor, contendo uma representação de cada elemento. Sintaxe: void trimToSize(); Ajusta a capacidade do Vetor para a atual dimensão do Vetor. Programa Exemplo: Mostra a utilização de vetor utilizando a classe Vector e alguns dos seus métodos. // ---------------------------------------------------------------------------------------------------------------- Programa Principal: ProgVector.java package progvector; import java.util.Scanner; import java.util.Vector; public class ProgVector { public static void main(String[] args) { Vector vetor = new Vector(); Scanner input = new Scanner(System.in); int u = -1, nodo; 65 do { u++; System.out.print("Nodo: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { vetor.add(nodo); // vetor.add(u, nodo); onde “u” é o último elemento } } while (nodo != 0); int n = vetor.size(); for (int i = 0; i < n;i++) { System.out.println("Elemento: " + vetor.get(i) + " "); } System.out.println("Número de Elementos: " + n); System.out.println("Vector: " + vetor); } } Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 60 <enter> Nodo: 0 <enter> Elemento: 10 Elemento: 20 Elemento: 30 Elemento: 40 Elemento: 50 Elemento: 60 Número de Elementos: 6 Vector: [10, 20, 30, 40, 50, 60] Programa Exemplo: Mostra um vetor utilizando a classe Vector, inserindo em uma determinada posição escolhida pelo usuário (note que os elementos tem que ser inseridos numa ordem crescente de “0” … “n”, sem pular nenhuma posição). // --------------------------------------------------------------------------------------------------------------- Programa Principal: ProgVector2.java package progvector2; import java.util.Scanner; import java.util.Vector; public class ProgVector2 { public static void main(String[] args) { Vector vetor = new Vector(); Scanner input = new Scanner(System.in); int nodo, pos; do { System.out.print("Nodo: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { System.out.print("Posição: "); s = input.nextLine(); pos = Integer.parseInt(s); if (pos >= 0 && pos <= vetor.size()) { vetor.add(pos, nodo); } 66 else { System.out.println("ERRO: Posição Inválida "); } } exibeVector(vetor); } while (nodo != 0); int n = vetor.size(); for (int i = 0; i < n;i++) { System.out.println("Elemento: "+ vetor.get(i) + " "); } System.out.println("Número de Elementos: " + n); System.out.println("Vector: " + vetor); } // ------------------------------------------------------- exibeVector static void exibeVector(Vector vetor) { System.out.printf("Indice: "); for (int i = 0;i < vetor.size();i++) { System.out.printf("%2d ", i); } System.out.println(); System.out.print(" Vetor: "); for (Object i : vetor) { System.out.printf("%2d ", i); } System.out.println(); } } Exemplo para testar o programa: Nodo: 10 <enter> Posição: 0 <enter> Indice: 0 Vetor: 10 Nodo: 20 <enter> Posição: 1 <enter> Indice: 0 1 Vetor: 10 20 Nodo: 30 <enter> Posição: 2 <enter> Indice: 0 1 2 Vetor: 10 20 30 Nodo: 40 <enter> Posição: 6 <enter> ERRO: Posição Inválida Indice: 0 1 2 Vetor: 10 20 30 Nodo: 0 <enter> Indice: 0 1 2 Vetor: 10 20 30 Elemento: 10 Elemento: 20 Elemento: 30 Número de Elementos: 3 Vector: [10, 20, 30] 5.4 LinkedList (Lista Encadeada Simples) import java.util.LinkedList; A lista LinkedList é utilizada para armazenar elementos em uma lista encadeada simples (Figura 4), ou seja, lista alocada dinamicamente, onde a lista cresce enquanto houver memória livre. 67 Figura 4: LinkedList - Lista Encadeada Simples A seguir são descritos os principais métodos de uma LinkedList. Sintaxe: void add (int posição, Object objeto); Insere o objeto na posição da lista. Sintaxe: boolean add (Objetc objeto); Anexa o objeto no final da lista. Sintaxe: boolean addAll (Collection coleção); Anexa todos os elementos da coleção no final da lista, na ordem que eles são retornados do iterador da coleção. Sintaxe: boolean addAll (int posição, Collection coleção); Insere todos os elementos da coleção dentro da lista, começando na posição. Sintaxe: void addFirst (Object objeto); Insere o objeto no começo da lista. Sintaxe: void addLast (Object objeto); Anexa o objeto no final da lista. Sintaxe: void clear (); Remove todos os elementos da lista. Sintaxe: Object clone (); Retorna uma cópia da lista. Sintaxe: boolean contains (Object objeto); Retorna verdadeiro (true) se a lista contém o objeto. Sintaxe: Object get (int posição); Retorna o objeto da posição na lista. Sintaxe: Object getFirst (); Retorna o primeiro objeto da lista. Sintaxe: Object getLast (); Retorna o último objeto da lista. Sintaxe: int indexOf (Object objeto); Retorna a posição do objeto na lista ou (-1) se a lista não contém este objeto. Sintaxe: int lastIndexOf (Object objeto); Retorna a última posição do objeto na lista ou (-1) se a lista não contém este objeto. 68 Sintaxe: ListIterator listIterator (int posição); Retorna um iterador da lista dos elementos da lista, começando na posição na lista. Sintaxe: Object remove (int posição); Remove o objeto da posição na lista. Sintaxe: boolean remove (Object objeto); Remove a primeira ocorrência do objeto na lista. Sintaxe: Object removeFirst (); Remove e retorna o primeiro objeto da lista. Sintaxe: Object removeLast (); Remove e retorna o último objeto da lista. Sintaxe: Object set (int posição, Object objeto); Troca o objeto da posição na lista pelo o objeto especificado. Sintaxe: int size (); Retorna o número de elementos na lista. Sintaxe: Object [] toArray (); Retorna um “array” (vetor) contendo todos os elementos da lista. Sintaxe: Object [] toArray (Object [] objeto); Retorna um “array” (vetor) contendo todos os objetos da lista. Programa Exemplo: Mostra uma LinkedList e alguns de seus métodos inserindo inteiros. // ----------------------------------------------------------------------------------------------------------- Programa Principal: ProgLinkedList.java package proglinkedlist; import java.util.LinkedList; import java.util.Scanner; public class ProgLinkedList { public static void main(String[] args) { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); int valor; char op; do { exibeLista(lista); System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { do { System.out.print("[F]irst, [L]ast ou [A]dd: "); s = input.nextLine(); op = s.charAt(0); } while ("FfLlAa".indexOf(op) == -1); switch (op) { case 'F': case 'f': lista.addFirst(valor); break; case 'L': case 'l': lista.addLast(valor); break; case 'A': case 'a': lista.add(valor); break; } } 69 } while (valor != 0); exibeLista(lista); } // ---------------------------------------------------------------------- exibeLista public static void exibeLista(LinkedList lista) { int n = lista.size(); System.out.print("LinkedList: ["); for (int i = 0;i < n;i++) { System.out.print(lista.get(i) + " "); } System.out.println("]"); } } Exemplo para testar o programa: LinkedList: [] Valor: 10 <enter> [F]irst, [L]ast ou [A]dd: f <enter> LinkedList: [10 ] Valor: 20 <enter> [F]irst, [L]ast ou [A]dd: l <enter> LinkedList: [10 20 ] Valor: 30 <enter> [F]irst, [L]ast ou [A]dd: a <enter> LinkedList: [10 20 30 ] Valor: 0 <enter> LinkedList: [10 20 30 ] Programa Exemplo: Mostra uma LinkedList e alguns dos seus métodos inserindo inteiros e ordenando-os. // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgLinkedList2.java package proglinkedlist2; import java.util.Arrays; import java.util.LinkedList; public class ProgLinkedList2 { public static void main(String[] args) { LinkedList lista = new LinkedList(); lista.add(40); lista.add(20); lista.add(60); lista.add(10); lista.add(30); lista.add(50); Object[] listaOrdenada = lista.toArray(); Arrays.sort(listaOrdenada); System.out.print("LinkedList Ordenada: ["); for (Object i : listaOrdenada) { System.out.print(i + " "); } System.out.printf("\b\b]\n"); // olhe a explicação abaixo } } Resultado do Programa: LinkedList Ordenada: [10, 20, 30, 40, 50, 60] 70 Observação: O comando for acima é chamado de foreach. A sintaxe é descrita abaixo: Foreach (para cada … ) Sintaxe: for (Tipo_dado variávelControle : coleção ) { System.out.println(variávelControle); } Diferenças entre Classe e Interface Uma interface em Java é uma classe abstrata onde todos os métodos são abstratos (abstract) e públicos (public), e todos os atributos são estáticos (static) e constantes tipadas (final). Ela é semelhante a especificação de uma classe abstrata pura, com uma diferença: os métodos das classes abstratas podem ou não ser implementados nas classes que a estendem, já os métodos das interfaces tem que ser obrigatoriamente implementados nas classes que as implementam. Uma interface permite estabelecer uma padronização que deve ser obedecida pela classe que a implementa. Quando uma classe implementa uma interface, ela deve garantir que todas as funcionalidades especificadas pela interface estarão presentes na classe. A sintaxe da declaração de uma interface é parecida na definição de classes, porém seu corpo define apenas as assinaturas dos métodos e constantes contidos na interface. 71 5.5 Arrays (array) import java.util.Arrays; A classe Arrays pode ser utilizada em variáveis do tipo vetor e permite “copiar”, “ordenar”, “buscar” e “manipular” vetores. Note que não se declara vetores do tipo Arrays. Programa Exemplo: Demonstra a utilização da classe Arrays e alguns de seus métodos. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgArraysTeste.java package progarraysteste; import java.util.Arrays; public class ProgArraysTeste { public static void main(String[] args) { int[] vetor = {60, 30, 50, 20, 40, 10}; System.out.println("Número de Elementos do Vetor: " + vetor.length); System.out.println("Vetor Original: " + Arrays.toString(vetor)); Arrays.sort(vetor); System.out.println("Vetor Ordenado: " + Arrays.toString(vetor)); int chaveProcura = 30; int indice = Arrays.binarySearch(vetor, chaveProcura); // vetor deve estar ordenado System.out.println("Chave: " + chaveProcura); System.out.println("Índice do Elemento Chave: " + indice); } } Resultado do Programa: Número de Elementos do Vetor: 6 Vetor Original: [60, 30, 50, 20, 40, 10] Vetor Ordenado: [10, 20, 30, 40, 50, 60] Chave: 30 Índice do Elemento Chave: 2 A seguir são descritos os principais métodos da classe Arrays. Sintaxe: static int binarySearch(byte[] vetor, byte chave); Procura em um vetor de “byte” pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarySearch(char[] vetor, char chave); Procura em um vetor de “char” pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarySearch(double[] vetor, double chave); Procura em um vetor de double pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarySearch(float[] vetor, float chave); Procura em um vetor de float pela chave utilizando algoritmo de busca binária. 72 Sintaxe: static int binarySearch(int[] vetor, int chave); Procura em um vetor de int pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarySearch(long[] vetor, long chave); Procura em um vetor de long pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarySearch(Object[] vetor, Object chave); Procura em um vetor de Object pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarySearch(short[] vetor, short chave); Procura em um vetor de short pela chave utilizando algoritmo de busca binária. Sintaxe: static boolean deepEquals(Object[] obj1, Object[] obj2); Retorna true se os dois arrays de objetos são iguais. Sintaxe: static int deepHashCode(Object[] objeto); Retorna o código hash baseado na localização do array de objetos. Sintaxe: static String deepToString(Object[] objeto); Retorna em forma de string a localização do array de objetos. Sintaxe: static boolean equals(boolean[] vetor1, boolean[] vetor2); Retorna true se os dois arrays de boolean são iguais. Sintaxe: static boolean equals(byte[] vetor1, byte[] vetor2); Retorna true se os dois arrays de byte são iguais. Sintaxe: static boolean equals(char[] vetor1, char[] vetor2); Retorna true se os dois arrays de char são iguais. Sintaxe: static boolean equals(double[] vetor1, double[] vetor2); Retorna true se os dois arrays de double são iguais. Sintaxe: static boolean equals(float[] vetor1, float[] vetor2); Retorna true se os dois arrays de float são iguais. Sintaxe: static boolean equals(int[] vetor1, int[] vetor2); Retorna true se os dois arrays de int são iguais. Sintaxe: static boolean equals(long[] vetor1, long[] vetor2); Retorna true se os dois arrays de long são iguais. Sintaxe: static boolean equals(Object[] vetor1, Object[] vetor2); Retorna true se os dois arrays de Object são iguais. Sintaxe: static boolean equals(short[] vetor1, short[] vetor2); Retorna true se os dois arrays de short são iguais. Sintaxe: static void fill(boolean[] vetor, boolean valor); Atribui um valor booleano para cada elemento do vetor de booleanos. Sintaxe: static void fill(boolean[] vetor, int fromIndex, int toIndex, boolean valor); Atribui um valor booleano para cada elemento da faixa do vetor de booleanos. Sintaxe: static void fill(byte[] vetor, byte valor); Atribui um valor byte para cada elemento do vetor de bytes. Sintaxe: static void fill(byte[] vetor, int fromIndex, int toIndex, byte valor); Atribui um valor byte para cada elemento da faixa do vetor de bytes. Sintaxe: static void fill(char[] vetor, char valor); Atribui um valor char para cada elemento do vetor de caracteres. Sintaxe: static void fill(char[] vetor, int fromIndex, int toIndex, char valor); Atribui um valor char para cada elemento da faixa do vetor de caracteres. Sintaxe: static void fill(double[] vetor, double valor); Atribui um valor double para cada elemento do vetor de double. 73 Sintaxe: static void fill(double[] vetor, int fromIndex, int toIndex, double valor); Atribui um valor double para cada elemento da faixa do vetor de double. Sintaxe: static void fill(float[] vetor, float valor); Atribui um valor float para cada elemento do vetor de float. Sintaxe: static void fill(float[] vetor, int fromIndex, int toIndex, float valor); Atribui um valor float para cada elemento da faixa do vetor de float. Sintaxe: static void fill(int[] vetor, int valor); Atribui um valor int para cada elemento do vetor de inteiros Sintaxe: static void fill(int[] vetor, int fromIndex, int toIndex, int valor); Atribui um valor int para cada elemento da faixa do vetor de inteiros. Sintaxe: static void fill(long[] vetor, int fromIndex, int toIndex, long valor); Atribui um valor long para cada elemento da faixa do vetor de inteiros longos. Sintaxe: static void fill(long[] vetor, long valor); Atribui um valor long para cada elemento do vetor de long. Sintaxe: static void fill(Object[] vetor, int fromIndex, int toIndex, Object valor); Atribui um valor Object para cada elemento da faixa do vetor de objetos. Sintaxe: static void fill(Object[] vetor, Object valor); Atribui um valor Object para cada elemento do vetor de Object. Sintaxe: static void fill(short[] vetor, int fromIndex, int toIndex, short valor); Atribui um valor short para cada elemento da faixa do vetor de inteiros curtos. Sintaxe: static void fill(short[] vetor, short val); Atribui um valor short para cada elemento do vetor de inteiros curtos. Sintaxe: static int hashCode(boolean[] vetor); Retorna o código hash com base no conteúdo do vetor de booleanos. Sintaxe: static int hashCode(byte[] vetor); Retorna o código hash com base no conteúdo do vetor de byte. Sintaxe: static int hashCode(char[] vetor); Retorna o código hash com base no conteúdo do vetor de caracteres. Sintaxe: static int hashCode(double[] vetor); Retorna o código hash com base no conteúdo do vetor de double. Sintaxe: static int hashCode(float[] vetor); Retorna o código hash com base no conteúdo do vetor de float. 74 Sintaxe: static int hashCode(int[] vetor); Retorna o código hash com base no conteúdo do vetor de inteiros. Sintaxe: static int hashCode(long[] vetor); Retorna o código hash com base no conteúdo do vetor de inteiros longos. Sintaxe: static int hashCode(Object[] vetor); Retorna o código hash com base no conteúdo do vetor de objetos. Sintaxe: static int hashCode(short[] vetor); Retorna o código hash com base no conteúdo do vetor inteiros curtos. Sintaxe: static void sort(byte[] vetor); Ordena o vetor de byte em ordem ascendente numérica. Sintaxe: static void sort(byte[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de byte em ordem ascendente numérica. Sintaxe: static void sort(char[] vetor); Ordena o vetor de char em ordem ascendente numérica. Sintaxe: static void sort(char[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de char em ordem ascendente numérica. Sintaxe: static void sort(double[] vetor); Ordena o vetor de double em ordem ascendente numérica. Sintaxe: static void sort(double[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de double em ordem ascendente numérica. Sintaxe: static void sort(float[] vetor); Ordena o vetor de float em ordem ascendente numérica. Sintaxe: static void sort(float[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de float em ordem ascendente numérica. Sintaxe: static void sort(int[] vetor); Ordena o vetor de int em ordem ascende numérica. Sintaxe: static void sort(int[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de int em ordem ascendente numérica. Sintaxe: static void sort(long[] vetor); Ordena o vetor de long em ordem ascendente numérica. Sintaxe: static void sort(long[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de long em ordem ascendente numérica. Sintaxe: static void sort(Object[] vetor); Ordena o vetor de Object em ordem ascendente numérica, de acordo com a ordem natural dos elementos. Sintaxe: static void sort(Object[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de Object em ordem ascendente numérica. Sintaxe: static void sort(short[] vetor); Ordena o vetor de short em ordem ascendente numérica. Sintaxe: static void sort(short[] vetor, int fromIndex, int toIndex); Ordena a faixa do vetor de short em ordem ascendente numérica. Sintaxe: static String toString(boolean[] vetor) Retorna uma string com o conteúdo do vetor de boleanos. Sintaxe: static String toString(byte[] vetor); Retorna uma string com o conteúdo do vetor de byte. Sintaxe: static String toString(char[] vetor); Retorna uma string com o conteúdo do vetor de char. 75 Sintaxe: static String toString(double[] vetor); Retorna uma string com o conteúdo do vetor de double. Sintaxe: static String toString(float[] vetor); Retorna uma string com o conteúdo do vetor de float. Sintaxe: static String toString(int[] vetor); Retorna uma string com o conteúdo do vetor de int. Sintaxe: static String toString(long[] vetor); Retorna uma string com o conteúdo do vetor de inteiros longos. Sintaxe: static String toString(Object[] vetor); Retorna uma string com o conteúdo do vetor de objetos. Sintaxe: static String toString(short[] vetor); Retorna uma string com o conteúdo do vetor de inteiros curtos. Programa Exemplo: Utiliza a classe Arrays e alguns métodos que permitem ordenar (sort) e listar um vetor. // ---------------------------------------------------------------------------------------------------------------- Programa Principal: ProgArrays.java package progarrays; import java.util.Arrays; import java.util.Scanner; public class ProgArrays { public static void main(String[] args) { final int MAX = 10; int [] vetor = new int[MAX]; Scanner input = new Scanner(System.in); int u = -1, n = 0, valor; do { u++; n++; System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { vetor[u] = valor; } else { u--; } } while (valor != 0 && n < MAX); Arrays.sort(vetor, 0, u); // último elemento // número de elementos // vetor, início, fim String extenso = Arrays.toString(vetor); System.out.println("Array: " + extenso); } } Exemplo para testar o programa: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 40 <enter> Valor: 50 <enter> Valor: 0 <enter> Array: [10, 20, 30, 40, 50, 0, 0, 0, 0, 0] 76 5.6 ArrayList (lista de array) A classe ArrayList possui os mesmos métodos da classe Vector e permite armazenar elementos como se fosse um vetor dinâmico, ou seja, sem limite da quantidade de elementos. Programa Exemplo: Mostra dois arrays que armazenam respectivamente: nomes e idades, note que não há ligação física entre eles, somente uma ligação lógica. // ------------------------------------------------------------------------------------------------------------ Programa Principal: ProgArrayList.java package progarraylist; import java.util.ArrayList; public class ProgArrayList { public static void main(String[] args) { ArrayList <String> nome = new ArrayList <> (); // ArrayList nome = new ArrayList(); // funciona assim também nome.add("Paulo Roberto"); nome.add("Renato Luis"); nome.add("Francisco Carlos"); nome.add("Ana Maria"); nome.add("Julia Helena"); ArrayList <Integer> idade = new ArrayList (); idade.add(48); idade.add(46); idade.add(50); idade.add(53); idade.add(52); int n = nome.size(); for (int i = 0;i < n;i++) { System.out.printf("Nome: %-20s Idade: %d\n", nome.get(i), idade.get(i)); } } } Resultado do Programa: Nome: Paulo Roberto Idade: 48 Nome: Renato Luis Idade: 46 Nome: Francisco Carlos Idade: 50 Nome: Ana Maria Idade: 53 Nome: Julia Helena Idade: 52 Programa Exemplo: Mostra uma forma abreviada de listar um ArrayList, chamada foreach. // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgArrayListView.java package progarraylistview; import java.util.ArrayList; public class ProgArrayListView { public static void main(String[] args) { 77 ArrayList lista = new ArrayList(); lista.add("Ana"); lista.add("Beatriz"); lista.add("Carla"); lista.add("Débora"); for (Object i : lista) { System.out.println(i); } // foreach ... para cada ... } } Resultado do Programa: Ana Beatriz Carla Débora Programa Exemplo: Um vetor utilizando a classe Vector e a classe ArrayList, inserindo inteiros e caracteres. O programa utiliza o método toArray para criar um array de objetos (Object). // -------------------------------------------------------------------------------------------------------------- Programa Principal: ProgtoArray.java package progtoarray; import java.util.ArrayList; import java.util.Vector; public class ProgtoArray { public static void main(String[] args) { ArrayList <Integer> lista = new ArrayList(); lista.add(10); lista.add(30); lista.add(40); lista.add(1, 20); System.out.println("ArrayList: " + lista); Object [] objeto = lista.toArray(); System.out.print("Objetos: "); for(int i = 0;i < lista.size();i++) { System.out.print(objeto[i] + " "); } System.out.println(); Vector vetor = new Vector(); vetor.add('A'); vetor.add('C'); vetor.add('D'); vetor.add(1, 'B'); System.out.println("Vector: " + vetor); Object [] objet = vetor.toArray(); System.out.print("Objetos: "); for(int i = 0;i < vetor.size();i++) { System.out.print(objet[i] + " "); } System.out.println(); } } 78 Resultado do Programa: ArrayList: [10, 20, 30, 40] Objetos: 10 20 30 40 Vector: [A, B, C, D] Objetos: A B C D 5.6.1 Lista de exercícios: Vector, ArrayList e LinkedList 5.6.1.1 Escreva um programa em Java que recebe via teclado um conjunto de letras. Armazene todas as letras em um vetor de letras (Vector ou ArrayList) até que o usuário digite um F ou f. Logo após copie todas as letras (em ordem inversa) para outro vetor (inverso). Ao final imprima os dois vetores. Entrada: Letra: L <enter> Letra: I <enter> Letra: M <enter> Letra: A <enter> Letra: f <enter> Saída: [L, I, M, A] [A, M, I, L] 5.6.1.2 Escreva um programa em Java que recebe via teclado: número de idades e as respectivas idades. Armazene todas as idades em um vetor de idades (Vector ou ArrayList). Logo após a entrada de todas as idades, o programa deve receber via teclado: idade para consulta. O programa deve imprimir na tela, o número de idades antes da idade de consulta e o número de idades depois da idade de consulta. Exemplo para testar o programa: Número de idades: 6 <enter> Idade: 30 <enter> Idade: 60 <enter> Idade: 10 <enter> Idade: 50 <enter> Idade: 20 <enter> Idade: 40 <enter> Idade para consulta: 50 <enter> Antes: 3 Depois: 2 Continua [S/N]? n <enter> 5.6.1.3 Escreva um programa em Java que recebe via teclado um conjunto de números inteiros. Armazene todos os números inteiros em um vetor (Vector ou ArrayList) até que o usuário digite 0 (zero). Logo após permita ao usuário consultar um número informando o seu valor. O programa deve imprimir na tela a posição do número no vetor ou ERRO: Número não encontrado (O programa termina quando o usuário digitar 0 (zero) na entrada) (veja o exemplo abaixo): Exemplo para testar o programa: Número: 50 <enter> Número: 30 <enter> Número: 20 <enter> Número: 10 <enter> Número: 40 <enter> Número: 0 <enter> Valor: 20 <enter> Posição no vetor: 2 Valor: 40 <enter> Posição no vetor: 4 Valor: 60 <enter> ERRO: Número não encontrado Valor: 0 <enter> 79 5.6.1.4 Escreva um programa em Java que recebe via teclado "n" conceitos (A, B, C, D e E) até que o usuário digite F ou f. Armazene todos os conceitos em um vetor de conceitos (Vector ou ArrayList). Imprima na tela o número de alunos: aprovados (A, B e C), reprovados (D) e os infreqüentes (E). Entrada: Conceito: B <enter> Conceito: A <enter> Conceito: E <enter> Conceito: B <enter> Conceito: D <enter> Conceito: C <enter> Conceito: A <enter> Conceito: E <enter> Conceito: f <enter> Saída: 5 Aprovado(s) 1 Reprovado(s) 2 Infreqüente (s) 5.6.1.5 Escreva um programa em Java que recebe via teclado “n” nomes e armazena num vetor de nomes (Vector ou ArrayList). A entrada dos nomes termina quando o usuário digitar apenas <enter>. Logo após a entrada de todos os nomes o programa deve permitir a entrada via teclado de uma letra. O programa deve imprimir na tela todos os nomes que começam com a letra especificada pelo usuário. O programa termina quanto o usuário digitar “” (nada) na entrada da letra (conforme exemplos abaixo): Exemplo para testar o programa: Nome: Paulo <enter> Nome: Roberto <enter> Nome: Renato <enter> Nome: Pedro <enter> Nome: Fabio <enter> Nome: <enter> Letra: R <enter> Nome: Roberto Nome: Renato Letra: P <enter> Nome: Paulo Nome: Pedro Letra: T <enter> Letra: <enter> 5.6.1.6 Escreva um programa em Java que recebe via teclado “n” nomes e idades, armazenando em dois vetores (Vector ou ArrayList). A entrada dos dados termina quando o usuário digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Logo após a entrada de todos os dados o programa deve imprimir na tela todos os nomes e idades desde o mais velho até o mais novo. Entrada: Nome: Ana <enter> Idade: 12 <enter> Continua [S/N]? s <enter> Nome: Beatriz <enter> Idade: 13 <enter> Continua [S/N]? s <enter> Nome: Carla <enter> Idade: 14 <enter> Continua [S/N]? N <enter> Saída: Carla Beatriz Ana 14 13 12 5.6.1.7 Escreva um programa em Java que recebe via teclado “n” nomes armazenando em um vetor de nomes (Vector ou ArrayList). A entrada dos dados termina quando o usuário digitar apenas "enter". Logo após a entrada de todos os dados, o programa deve imprimir na tela todos os nomes em ordem alfabética de ‘A’ à ‘Z’ (conforme exemplo abaixo). 80 Entrada: Nome: Beatriz <enter> Nome: Ana <enter> Nome: Debora <enter> Nome: Carla <enter> Nome: Eva <enter> Nome: Geni <enter> Nome: Fernanda <enter> Nome: <enter> Saída: ArrayList: [Ana, Beatriz, Carla, Debora, Eva, Fernanda, Geni] 5.6.1.8 Escreva um programa em Java que recebe via teclado “n” idades, armazenando-as em um vetor (Vector ou ArrayList) até que o usuário digite ‘0’ (zero). O programa deve então imprimir na tela: (a) as idades em ordem crescente; (b) maior idade; (c) menor idade e (d) a média de idades(conforme exemplo abaixo). Entrada: Idade: 49 <enter> Idade: 51 <enter> Idade: 48 <enter> Idade: 50 <enter> Idade: 0 <enter> Saída: Idades Ordenadas: 48 49 50 51 Maior Idade: 51 Menor Idade: 48 Média de Idades: 49.5 5.6.1.9 Escreva um programa em Java que lê um vetor 5 elementos contendo o gabarito da LOTO. A seguir, ler outro vetor de 10 elementos contendo uma aposta qualquer (exatamente conforme o exemplo abaixo, ou seja, os dados devem estar em duas linhas, um ao lado do outro). A seguir imprima quantos pontos fez o apostador (conforme exemplo abaixo). Os vetores devem ser armazenados em um Vector ou ArrayList Entrada: 4 12 34 25 17 <enter> (gabarito) 3 17 55 21 34 4 27 29 20 11 <enter>(aposta) Saída: 3 ponto(s) 5.6.1.10 Escreva um programa em Java que lê o número de palpites para a megaSena. O programa deve então gerar “n” palpites para o Jogo da MegaSena (sem repetição em cada palpite e ordenados em ordem crescente). O programa deve exibir na tela estes palpites (conforme exemplo abaixo). Entrada: Número de Palpites para a MegaSena: 4 <enter> Saída: Palpite para MegaSena é [4, 22, 43, 55, 93, 99] Palpite para MegaSena é [17, 39, 57, 74, 81, 98] Palpite para MegaSena é [5, 9, 15, 18, 63, 93] Palpite para MegaSena é [14, 20, 42, 48, 80, 88] Observação: Note que cada palpite deve estar armazenado em um Vector ou ArrayList 5.6.1.11 Escreva um programa em Java que armazena “n” números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui três funções básicas: [I]ncluir, [C]onsultar e [R]emover, todas elas em ambos os lados da lista encadeada: [E]squerda e [D]ireita (conforme exemplo abaixo). 81 Exemplo para testar o programa: [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita e <enter> Dado: 10 LinkedList: [10] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 20 LinkedList: [10, 20] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 30 LinkedList: [10, 20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> Dado Removido à esquerda: 10 LinkedList: [20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> Dado Removido à esquerda: 20 LinkedList: [30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> Dado Removido à esquerda: 30 LinkedList: [] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> ERRO: Lista Vazia LinkedList: [] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita d <enter> ERRO: Lista Vazia LinkedList: [] [I]ncluir, [C]onsultar, [R]emover ou [F]im: f <enter> 5.6.1.12 Complemente o programa anterior com a função de “Incluir”, “consultar” e “remover” em uma posição escolhida pelo usuário, ou seja, [E]squerda, [P]osição ou [D]ireita (conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: e <enter> Dado: 10 <enter> LinkedList: [10] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: d <enter> Dado: 20 LinkedList: [10, 20] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: d <enter> Dado: 40 LinkedList: [10, 20, 40] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: p <enter> Dado: 30 <enter> Posição: 2 <enter> LinkedList: [10, 20, 30, 40] [I]ncluir, [C]onsultar, [R]emover ou [F]im: c <enter> [E]squerda, [P]osição [D]ireita: p <enter> Posição: 2 <enter> Dado Consultado: 30 LinkedList: [10, 20, 30, 40] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda, [P]osição [D]ireita: p <enter> Posição: 3 <enter> Dado Removido da Posição: 40 82 LinkedList: [10, 20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda, [P]osição [D]ireita: p <enter> Posição: 6 <enter> ERRO: Posição Inválida LinkedList: [10, 20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: f <enter> 5.6.1.13 Escreva um programa em Java que armazena “n” números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui três funções básicas: [I]ncluir, [E]lemento e [R]emover, as funções “Incluir” e “Remover” em ambos os lados da lista encadeada: [E]squerda ou [D]ireita e a função “Elemento” deve listar o ANTECESSOR e o SUCESSOR deste elemento (ou “SEM ANTECESSOR” e/ou “SEM SUCESSOR”) (conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [E]lemento, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita e <enter> Dado: 10 <enter> LinkedList: [10] [I]ncluir, [E]lemento, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 20 <enter> LinkedList: [10, 20] [I]ncluir, [E]lemento, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 30 <enter> LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: e <enter> Elemento a Pesquisar: 20 <enter> Antecessor: 10 Sucessor: 30 LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: e <enter> Elemento a Pesquisar: 10 <enter> ERRO: SEM ANTECESSOR Sucessor: 20 LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: e <enter> Elemento a Pesquisar: 30 <enter> Antecessor: 20 ERRO: SEm SUCESSOR LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: f <enter> 83 5.6.1.14 Escreva um programa em Java que armazena “n” números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui quatro funções básicas: [I]ncluir, [E]lemento, [P]esquisar e [R]emover. As funções “Incluir” e “Remover” em ambos os lados da lista encadeada: [E]squerda e [D]ireita. A função “Elemento” verifica o Antecessor e o Sucessor de um determinado elemento. A função “Pesquisar” pesquisa um determinado elemento pelo índice(conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: e <enter> Dado: 10 <enter> Indices: 0 LinkedList: [10] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 20 <enter> Indices: 0 1 LinkedList: [10, 20] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 30 <enter> Indices: 0 1 2 LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 40 <enter> Indices: 0 1 2 3 LinkedList: [10, 20, 30, 40] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: p <enter> Indice: 2 <enter> Dado Pesquisado pelo Indice: 30 Indices: 0 1 2 3 LinkedList: [10, 20, 30, 40] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: p <enter> Indice: 8 <enter> ERRO: Indice Inexistente Indices: 0 1 2 3 LinkedList: [10, 20, 30, 40] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: f <enter> 5.6.1.15 Escreva um programa em Java que armazena “n” números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui três funções básicas: [I]ncluir, [S]ort e [C]lear All. A função “Incluir” inclui em ambos os lados da lista encadeada: [E]squerda e [D]ireita. A função “Sort” ordena a lista encadeada. A função “Clear All” remove todos os elementos(conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: e <enter> Dado: 10 <enter> Indices: 0 LinkedList: [10] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 40 <enter> Indices: 0 1 LinkedList: [10, 40] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 50 <enter> Indices: 0 1 2 LinkedList: [10, 40, 50] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 30 <enter> Indices: 0 1 2 3 84 LinkedList: [10, 40, 50, 30] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 20 <enter> Indices: 0 1 2 3 4 LinkedList: [10, 40, 50, 30, 20] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: e <enter> Dado: 60 <enter> Indices: 0 1 2 3 4 5 LinkedList: [60, 10, 40, 50, 30, 20] [I]ncluir, [S]ort, [C]lear All ou [F]im: s <enter> Indices: 0 1 2 3 4 5 LinkedList: [10, 20, 30, 40, 50, 60] [I]ncluir, [S]ort, [C]lear All ou [F]im: c <enter> Indices: LinkedList: [] [I]ncluir, [S]ort, [C]lear All ou [F]im: f <enter> 5.6.1.16 Escreva um programa em Java que armazena “n” números inteiros em um vetor (Vector, ArrayList ou LinkedList), mantendo-os ordenados conforme a entrada das informações (conforme exemplo abaixo). O programa deve ir exibindo os elementos na tela a cada nova entrada. A entrada das informações termina quando o usuário digitar zero (0). Exemplo para testar o programa: Info: 10 <enter> ArrayList: [10] Info: 30 <enter> ArrayList: [10, 30] Info: 40 <enter> ArrayList: [10, 30, 40] Info: 20 <enter> ArrayList: [10, 20, 30, 40] Info: 5 <enter> ArrayList: [5, 10, 20, 30, 40] Info: 60 <enter> ArrayList: [5, 10, 20, 30, 40, 60] Info: 50 <enter> ArrayList: [5, 10, 20, 30, 40, 50, 60] Info: 20 <enter> ERRO: Informação Repetida ArrayList: [5, 10, 20, 30, 40, 50, 60] Info: 0 <enter> ArrayList: [5, 10, 20, 30, 40, 50, 60] 5.7 ArrayList bidimensional Em Java é possível criar um array bidimensional usando a classe ArrayList. Programa Exemplo: Mostra a utilização de um ArrayList bidimensional. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgArrayList2D.java package progarraylist2d; import java.util.ArrayList; public class ProgArrayList2D { public static void main(String[] args) { final int numeroLinhas = 7; final int numeroColunas = 5; ArrayList[][] tabela = new ArrayList[numeroLinhas][numeroColunas]; 85 int x = 10; for (int i = 0; i < numeroLinhas; i++) { int n = x; for (int j = 0; j < numeroColunas; j++) { tabela[i][j] = new ArrayList(); tabela[i][j].add(n); n = n + 10; } x++; } for (int i = 0; i < numeroLinhas; i++) { for (int j = 0; j < numeroColunas; j++) { System.out.print(tabela[i][j]); } System.out.println(); } } } Resultado do Programa: [10][20][30][40][50] [11][21][31][41][51] [12][22][32][42][52] [13][23][33][43][53] [14][24][34][44][54] [15][25][35][45][55] [16][26][36][46][56] Programa Exemplo: Escreva um programa em Java que lê duas matrizes: A e B e gera uma matriz C que é a multiplicação da matriz A com a matriz B. Todas as matrizes devem ser ArrayList’s. // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgMultMatriz.java package progmultmatriz; import java.util.ArrayList; import java.util.Scanner; public class ProgMultMatriz { public static void main(String[] args) { int ma, na, mb, nb; Scanner entrada = new Scanner(System.in); String s; System.out.print("Número de Linhas da Matriz A (mA): "); s = entrada.nextLine(); ma = Integer.parseInt(s); System.out.print("Número de Colunas da Matriz A(nA): "); s = entrada.nextLine(); na = Integer.parseInt(s); System.out.print("Número de Linhas da Matriz B(mB): "); s = entrada.nextLine(); mb = Integer.parseInt(s); System.out.print("Número de Colunas da Matriz B(nB): "); s = entrada.nextLine(); nb = Integer.parseInt(s); if (na != mb) { System.out.println("Erro Fatal: Multiplicação Impossível"); System.out.println("Número de Colunas de A (nA) tem que ser igual número de linhas de B (mB)"); System.exit(0); } ArrayList[][] a = new ArrayList[ma][na]; 86 ArrayList[][] b = new ArrayList[mb][nb]; ArrayList[][] c = new ArrayList[ma][nb]; System.out.println("Matriz A"); for (int lin = 0; lin < ma; lin++) { for (int col = 0; col < na; col++) { a[lin][col] = new ArrayList(); System.out.print("A[" + (lin + 1) + ", " + (col + 1) + "]: "); s = entrada.nextLine(); a[lin][col].add(Integer.parseInt(s)); } } System.out.println("Matriz B"); for (int lin = 0; lin < mb; lin++) { for (int col = 0; col < nb; col++) { b[lin][col] = new ArrayList(); System.out.print("B[" + (lin + 1) + ", " + (col + 1) + "]: "); s = entrada.nextLine(); b[lin][col].add(Integer.parseInt(s)); } } System.out.println("Matriz C = A x B"); for (int lin = 0; lin < ma; lin++) { for (int col = 0; col < nb; col++) { int soma = 0; for (int k = 0; k < na; k++) { c[lin][col] = new ArrayList(); String A = ""; A = A + a[lin][k].get(0); String B = ""; B = B + b[k][col].get(0); soma = soma + Integer.parseInt(A) * Integer.parseInt(B); } c[lin][col].add(soma); } } for (int lin = 0; lin < ma; lin++) { for (int col = 0; col < nb; col++) { System.out.println("C[" + (lin + 1) + ", " + (col + 1) + "]: " + c[lin][col]); } } } } Exemplo para testar o programa: Número de Linhas da Matriz A (mA): 2 <enter> Número de Colunas da Matriz A(nA): 2 <enter> Número de Linhas da Matriz B(mB): 2 <enter> Número de Colunas da Matriz B(nB): 3 <enter> Matriz A A[1, 1]: 1 <enter> A[1, 2]: 2 <enter> A[2, 1]: 3 <enter> A[2, 2]: 4 <enter> Matriz B B[1, 1]: 1 <enter> B[1, 2]: 2 <enter> B[1, 3]: 3 <enter> B[2, 1]: 4 <enter> B[2, 2]: 5 <enter> B[2, 3]: 6 <enter> Matriz C = A x B C[1, 1]: [9] C[1, 2]: [12] C[1, 3]: [15] 87 C[2, 1]: [19] C[2, 2]: [26] C[2, 3]: [33] Programa Exemplo: Escreva um programa em Java que leia uma matriz A (3 x 4) e cria 2 vetores SL e SC de 3 e 4 elementos que contenham respectivamente a soma das linhas (SL) e a soma das colunas (SC). Imprimir os vetores SL e SC. // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgArrayList2D_2.java package progarraylist2d_2; import java.util.ArrayList; import java.util.Scanner; public class ProgArrayList2D_2 { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); final int numeroLinhas = 3, numeroColunas = 4; ArrayList <Integer> [][] a = new ArrayList[numeroLinhas][numeroColunas]; ArrayList <Integer> [] sl = new ArrayList[numeroLinhas]; ArrayList <Integer> [] sc = new ArrayList[numeroColunas]; for (int l = 0; l < numeroLinhas; l++) { for (int c = 0; c < numeroColunas; c++) { a[l][c] = new ArrayList(); // instanciar cada elemento System.out.print("a [" + (l + 1) + "," + (c + 1) + "]: "); String s = entrada.nextLine(); a[l][c].add(Integer.parseInt(s)); } } int k = 0; for (int l = 0; l < numeroLinhas; l++) { int soma = 0; for (int c = 0; c < numeroColunas; c++) { soma = soma + a[l][c].get(0).hashCode(); sl[k] = new ArrayList(); // instanciar cada elemento sl[k].add(soma); } k++; } System.out.println(); for (k = 0; k < numeroLinhas; k++) { System.out.println("sl[" + (k + 1) + "]: " + sl[k]); } k = 0; for (int c = 0; c < numeroColunas; c++) { int soma = 0; for (int l = 0; l < numeroLinhas; l++) { soma = soma + a[l][c].get(0).hashCode(); sc[k] = new ArrayList(); // instanciar cada elemento sc[k].add(soma); } k++; } System.out.println(); for (k = 0; k < numeroColunas; k++) { System.out.println("sc[" + (k + 1) + "]: " + sc[k]); } System.out.println(); } } 88 Exemplo para testar o programa: a [1,1]: 1 <enter> a [1,2]: 2 <enter> a [1,3]: 3 <enter> a [1,4]: 4 <enter> a [2,1]: 5 <enter> a [2,2]: 6 <enter> a [2,3]: 7 <enter> a [2,4]: 8 <enter> a [3,1]: 9 <enter> a [3,2]: 10 <enter> a [3,3]: 11 <enter> a [3,4]: 12 <enter> sl[1]: [10] sl[2]: [26] sl[3]: [42] sc[1]: [15] sc[2]: [18] sc[3]: [21] sc[4]: [24] Programa Exemplo: Escreva um programa em Java que gera uma matriz A (12 x 13) e divide todos os elementos de cada uma das 12 linhas de A pelo valor do maior elemento daquela linha. Imprimir a matriz A modificada. // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgArrayList2D_3.java package progarraylist2d_3; import java.util.ArrayList; public class ProgArrayList2D_3 { public static void main(String[] args) { final int numeroLinhas = 12, numeroColunas = 13; ArrayList<Double>[][] a = new ArrayList[numeroLinhas][numeroColunas]; double x = 1.0; // gera matriz A for (int l = 0; l < numeroLinhas; l++) { for (int c = 0; c < numeroColunas; c++) { a[l][c] = new ArrayList(); if (c == 0) { a[l][c].add(x); x++; } else { a[l][c].add(1.0); } } } // lista o ArrayList 2D (matriz a) System.out.println("Matriz Original: "); for (int l = 0; l < numeroLinhas; l++) { for (int c = 0; c < numeroColunas; c++) { System.out.printf("%4.1f ", a[l][c].get(0)); } System.out.println(); } 89 // ArrayList 2D ArrayList<Double>[] maior = new ArrayList[numeroLinhas]; // ArrayList 1D System.out.println("\nMatriz Modificada: "); for (int l = 0; l < numeroLinhas; l++) { maior[l] = new ArrayList(); maior[l].add(0.0); for (int c = 0; c < numeroColunas; c++) { if (a[l][c].get(0) > maior[l].get(0)) { maior[l].remove(0); maior[l].add(a[l][c].get(0)); } } } for (int l = 0; l < numeroLinhas; l++) { for (int c = 0; c < numeroColunas; c++) { double div = a[l][c].get(0) / maior[l].get(0); a[l][c] = new ArrayList(); a[l][c].add(div); } } for (int l = 0; l < numeroLinhas; l++) { System.out.printf("%4.1f -> ", maior[l].get(0)); for (int c = 0; c < numeroColunas; c++) { System.out.printf("%.2f ", a[l][c].get(0)); } System.out.println(); } } } Resultado do Programa: Matriz Original: 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 2,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 3,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 4,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 5,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 6,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 7,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 8,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 9,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 10,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 11,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 12,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 Matriz Modificada: 1,0 -> 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 2,0 -> 1,00 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 3,0 -> 1,00 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 4,0 -> 1,00 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 5,0 -> 1,00 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 6,0 -> 1,00 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 7,0 -> 1,00 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 8,0 -> 1,00 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 9,0 -> 1,00 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 10,0 -> 1,00 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 11,0 -> 1,00 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 12,0 -> 1,00 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 5.8 Strings (Cadeia de Caracteres) Java possui um classe que permite a manipulação de Strings (cadeia de caracteres) chamada String. 90 Uma string é um tipo de dado que permite armazenar e manipular um conjunto de caracteres, números e caracteres especiais (Figura 5). Declaração e inicialização: String s = “Pelotas”; String r = null; String str = ““; Figura 5: Representação gráfica de uma String Onde: p é o índice do primeiro caracter (ou seja, zero) Character primeiroCaracter = s.charAt(0); n é o número de caracteres da String int n = s.length(); u é o índice do último caracter da String int u = n – 1; Character ultimoCaracter = s.charAt(u); ou Character primeiroCaracter = s.charAt(n-1); Observação: Note que igualmente a um vetor (array), Vector, ArrayList, LinkedList, o primeiro caracter da String encontra-se na posição zero (0), por isto nunca pode-se acessar o elemento “n” da String e sim o elemento de índice “u”. Forma alternativa (Utilizar com um vetor de caracteres): char[] s = {'P', 'e', 'l', 'o', 't', 'a', 's'}; System.out.println(s); System.out.println(Arrays.toString(s)); char caracteres[] = {'A', 'B', 'C', 'D', 'E', 'F'}; String string = new String(caracteres); System.out.println("string: " + string); int n = string.length(); for (int i = 0; i < n; i++) { System.out.println("Código ASCII: " + string.codePointAt(i)); } for (char ch : string.toCharArray()) { // foreach System.out.println("Caracter: " + ch); } Resultado do Programa: Pelotas [P, e, l, o, t, a, s] string: ABCDEF Código ASCII: 65 Código ASCII: 66 Código ASCII: 67 91 Código ASCII: 68 Código ASCII: 69 Código ASCII: 70 Caracter: A Caracter: B Caracter: C Caracter: D Caracter: E Caracter: F 5.8.1 Métodos para manipular Strings A seguir são descritos os principais métodos que permitem manipular objetos do tipo String. Sintaxe: char charAt(int posição); Retorna o caracter contido na posição. Modo de usar: String s = “Pelotas”; char ch = s.charAt(0); // ch = ‘P’; Sintaxe: int compareTo(Object objeto); Compara a string com um objeto. Sintaxe: int compareTo(String outraString); Compara duas strings lexicograficamente (caracter à caracter). Sintaxe: int compareToIgnoreCase(String string); Compara duas strings lexicograficamente, ignorando diferenças entre maíusculas e minúsculas. Sintaxe: String concat(String string); Concatena a string no fim da outra string. Sintaxe: boolean contentEquals(String stringBuffer); Retorna true se e somente se a string representa a mesma sequência de caracteres do que a stringBuffer. Sintaxe: static String copyValueOf(char[] vetor); Retorna uma string que representa a sequência de caracteres do vetor de careacteres. Sintaxe: static String copyValueOf(char[] vetor, int offset, int count); Retorna uma string que representa uma sequência de caracteres do vetor. Sintaxe: boolean endsWith(String sufixo); Testa se a string termina com o sufixo especificado. Sintaxe: boolean equals(Object objeto); Compara a string com o objeto. Sintaxe: boolean equalsIgnoreCase(String outraString); Compara a string com a outraString, ignorando maiúsculas e minúsculas. Sintaxe: byte[] getBytes(); Codifica a string em uma sequência de bytes usando o conjunto de caracteres, armazenando o resultado em um novo vetor de bytes. Sintaxe: byte[] getBytes(String charsetName); Codifica a string em uma sequência de bytes usando o conjunto de caracteres do nome, armazenando o resultado dentro do novo vetor. Sintaxe: void getChars(int fonteBegin, int fonteEnd, char[] destino, int destinoBegin); Cópia a seqüência de caracteres para um vetor de caracteres destino. Sintaxe: int hashCode(); Retorna o código hash da string. Sintaxe: int indexOf(int caracter); Retorna o índice dentro da string da primeira ocorrência do caracter especificado ou -1 se não encontrar. Sintaxe: int indexOf(int caracter, int fromIndex); Retorna o índice dentro da string da primeira ocorrência do caracter, iniciando a busca no índice. 92 Sintaxe: int indexOf(String string); Retorna o índice dentro da string da primeira ocorrência da substring. Sintaxe: int indexOf(String string, int fromIndex); Retorna o índice dentro da string da primeira ocorrência da substring, iniciando a busca no índice. Sintaxe: String intern(); Retorna uma representação canônica da string objeto (forma mais simples). Sintaxe: int lastIndexOf(int caracter); Retorna o índice dentro da string da última ocorrência do caracter. Sintaxe: int lastIndexOf(int caracter, int fromIndex); Retorna o índice dentro da string da última ocurrência do caracter, pesquisando para trás começando no índice. Sintaxe: int lastIndexOf(String string); Retorna o índice dentro da string da ocorrência mais à direita da subseqüência. Sintaxe: int lastIndexOf(String string, int fromIndex); Retorna o índice dentro da string da última ocorrência da substring, buscando para trás começando o índice. Sintaxe: int length(); Retorna o comprimento da string, ou seja, o número de caracteres presentes na string no momento. Sintaxe: boolean matches(String expressaoRegular); Diz se a string corresponde a uma expressão regular ou não. Sintaxe: boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len); Testa se duas regiões das strings são iguais. Sintaxe: boolean regionMatches(int toffset, String other, int ooffset, int len); Testa se duas regiões das strings são iguais. Sintaxe: String replace(char velhoCaracter, char novoCaracter); Retorna uma nova string resultante da troca de todas as ocorrências do velhoCaracter nesta string com novoCaracter. Sintaxe: String replaceAll(String expressaoRegular, String replacement); Substitui cada subseqüência da seqüência de caracteres que corresponde a expressão regular com a substituição dada. Sintaxe: String replaceFirst(String expressaoRegular, String replacement); Substitui as primeiras substrings dessa string que corresponde à expressão regular com a substituição dada. Sintaxe: String[] split(String expressaoRegular); Divide a string em pedaços (substrings) em torno da expressão regular. Sintaxe: String[] split(String expressaoRegular, int limite); Divide a string em pedaços em torno da expressão regular. Sintaxe: boolean startsWith(String prefixo); Testa se esta string começa com o prefixo. Sintaxe: boolean startsWith(String prefixo, int toffset); Testa se a string começa com o prefixo começando pelo índice. Sintaxe: CharSequence subSequence(int beginIndex, int endIndex); Retorna uma nova string de caracteres que é uma subseqüência desta seqüência. Sintaxe: String substring(int beginIndex); Retorna uma nova string que é uma substring desta string. Sintaxe: String substring(int beginIndex, int endIndex); Retorna uma nova string que é uma substring desta string. Sintaxe: char[] toCharArray(); Converte a string em um novo vetor de caracteres. Sintaxe: String toLowerCase(); 93 Converte todos os caracteres da string para minúsculos. Sintaxe: String toString(); Retorna o objeto como string. Sintaxe: String toUpperCase(); Converte todos os caracteres da string para maiúsculos. Sintaxe: String trim(); Retorna uma cópia da string. Sintaxe: static String valueOf(boolean flag); Retorna uma representação string do argumento boolean. Sintaxe: static String valueOf(char caracter); Retorna uma representação string do argumento char. Sintaxe: static String valueOf(char[] vetor); Retorna uma representação string do argumento char []. Sintaxe: static String valueOf(char[] vetor, int offset, int count); Retorna uma representação string do argumento char []. Sintaxe: static String valueOf(double realDouble); Retorna uma representação string do argumento double. Sintaxe: static String valueOf(float realFloat); Retorna uma representação string do argumento float. Sintaxe: static String valueOf(int inteiro); Retorna uma representação string do argumento int. Sintaxe: static String valueOf(long longo); Retorna uma representação string do argumento long. Sintaxe: static String valueOf(Object objeto); Retorna uma representação string do argumento Object. Exemplos: a) Exemplo do uso dos métodos toUpperCase e toLowerCase: // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgToUpperCase.java package progtouppercase; public class ProgToUpperCase { public static void main(String[] args) { String s = "Paulo Roberto Gomes Luzzardi"; System.out.println("Nome: " + s); System.out.println("Nome: " + s.toUpperCase()); System.out.println("Nome: " + s.toLowerCase()); } } Resultado do Programa: Nome: Paulo Roberto Gomes Luzzardi Nome: PAULO ROBERTO GOMES LUZZARDI Nome: paulo roberto gomes luzzardi b) Exemplo do uso de length, charAt e indexOf: // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgInverte.java 94 package proginverte; import java.util.Scanner; public class ProgInverte { public static void main(String[] args) { Scanner input = new Scanner(System.in); String s; int n; char op; do { System.out.print("Nome: "); s = input.nextLine(); System.out.print("Invertido: "); n = s.length(); // número de caracteres da String s for (int i = n-1;i >= 0;i--) { System.out.print(s.charAt(i)); // acesso a cada caracter da String s } System.out.println(); do { System.out.print("Continua [S/N]? "); s = input.nextLine(); op = s.charAt(0); } while ("SsNn".indexOf(op) == -1); // verifica se op é “SsNn” } while ("Ss".indexOf(op) != -1); // } while ("S".equalsIgnoreCase(s)); } } Exemplo para testar o orograma: Nome: pelotas <enter> Invertido: satolep Continua [S/N]? s <enter> Nome: satolep <enter> Invertido: pelotas Continua [S/N]? N <enter> c) Exemplo do uso de String.format: // --------------------------------------------------------------------------------------------------- Programa Principal: ProgStringFormat.java package progstringformat; public class ProgStringFormat { public static void main(String[] args) { float numero = 123.456789f; String formato = String.format("%.3f", numero); //JOptionPane.showMessageDialog(null, "numero: " + formato); System.out.printf("Número: %.4f\n", numero); System.out.println("Número Formatado: " + formato); } } Resultado do Programa: Número: 123,4568 Número Formatado: 123,457 5.8.2 Lista de exercícios: Strings 5.8.2.1 Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome imprima: número de letras maiúsculas, número de letras minúsculas, número de vogais e o número de consoantes, conforme exemplo abaixo: 95 Entrada: Nome: Faculdade de Tecnologia Senac <enter> Saída: (3) maiúscula(s) (23) minúscula(s) (12) vogais(s) (14) consoante(s) 5.8.2.2 Escreva um programa em Java que recebe via teclado uma palavra e uma letra. Logo após a entrada do nome e da letra imprima o número de letras que existe no nome ou ERRO: Não existe a letra (?) na palavra (?), conforme exemplo abaixo: Exemplo para testar o programa: Palavra: Luzzardi <enter> Letra: z <enter> 2 letra(s) Continua [S]im ou [N]ão? S <enter> Palavra: Luzzardi <enter> Letra: w <enter> ERRO: Não existe a letra (w) na palavra (Luzzardi) Continua [S]im ou [N]ão? N <enter> Observação: O programa deve ser encerrado quando o usuário digitar “N” ou “n” na pergunta: Continua [S]im ou [N]ão?. 5.8.2.3 Escreva um programa em Java que recebe via teclado uma palavra e uma posição. O programa deve imprimir na tela, a letra antecessora, a letra (da referida posição) e a letra sucessora, conforme exemplo abaixo: Entrada: Palavra: Universidade <enter> Posição: 7 <enter> Saída: Antecessora: s Letra: i Sucessora: d Observação: O programa deve imprimir na tela as seguintes mensagens de erro, se for o caso: Letra antecessora não existe, Letra sucessora não existe ou Posição inválida. 5.8.2.4 Escreva um programa em Java que recebe via teclado um nome. O programa deve imprimir, na tela, as palavras do nome em ordem inversa, uma por linha, conforme exemplo abaixo: Entrada: Nome: Paulo Roberto Gomes Luzzardi <enter> Saída: Luzzardi Gomes Roberto Paulo 5.8.2.5 Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome o programa deve imprimir (EM LETRA MAIÚSCULA) o sobrenome da pessoa, conforme exemplos abaixo: Exemplo para testar o programa: Sobrenome: LUZZARDI Sair [S/N]? N <enter> Nome: Renato Souza <enter> Sobrenome: SOUZA Sair [S/N]? s <enter> Observação: O programa termina quando o usuário digitar ‘S’ ou ‘s’ na pergunta: Sair [S/N]? 5.8.2.6 Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome o programa deve imprimir na tela: sobrenome, primeiro nome e demais nomes abreviados, conforme exemplos abaixo: Exemplo para testar o programa: Nome: Paulo Roberto Gomes Luzzardi <enter> Autor: Luzzardi, Paulo R. G. 96 Sair [S/N]? N <enter> Nome: Renato Lima Souza <enter> Autor: Souza, Renato L. Sair [S/N]? s <enter> Observação: O programa termina quando o usuário digitar ‘S’ ou ‘s’ na pergunta: Sair [S/N]? 5.8.2.7 Escreva um programa em Java que recebe via teclado o nome de um estado. Logo após a entrada do nome do estado imprima: a sigla do estado (2 letras maiúsculas), conforme exemplos abaixo: Exemplo para testar o programa: Estado: Rio Grande do Sul <enter> Sigla: RS Estado: são paulo <enter> Sigla: SP Estado: rio de janeiro <enter> Sigla: RJ Estado: <enter> Observação: O programa encerra quando o usuário digitar apenas <enter> na entrada do nome do estado. 5.8.2.8 Escreva um programa em Java que recebe via teclado uma palavra, início e fim. Logo após a entrada de todos os dados imprima a string resultante ou ERRO: Fim inválido ou Início inválido, conforme exemplos abaixo: Exemplo para testar o programa: Palavra: universidade <enter> Início: 7 <enter> Fim: 11 <enter> String resultante: idade Continua [S/N]? s <enter> Palavra: eletricidade <enter> Início: 7 <enter> Fim: 15 <enter> ERRO: Fim Inválido Continua [S/N]? N <enter> Observação: O programa termina quando o usuário digitar ‘N’ ou ‘n’ na pergunta: Continua [S/N]?. 5.9 Classe Object Em Java, todas as classes, sem nenhuma exceção, herdam direta ou indiretamente todos os métodos da classe Object, pois ela é a superclasse de qualquer outra classe. A seguir são descritos os métodos da classe Object. Sintaxe: protected Object clone(); Cria e retorna uma cópia do objeto. Sintaxe: boolean equals(Object objeto); Indica se um objeto é igual a outro. Sintaxe: protected void finalize(); Chama o coletor de lixo (garbage coletor) do objeto quando o coletor de lixo determina que não há mais referências ao objeto. Sintaxe: Class getClass(); Retorna a classe runtime do objeto. Sintaxe: int hashCode(); Retorna o valor do código hash do objeto. Sintaxe: void notify(); 97 Aguarda uma thread que está esperando o monitor do objeto. Sintaxe: void notifyAll(); Aguarda todas as threads que estão esperando o monitor do objeto. Sintaxe: String toString(); Retorna uma string do objeto. Sintaxe: void wait(); Faz a thread corrente esperar até que outra thread invoque os métodos notify() ou notifyAll() deste objeto. Sintaxe: void wait(long timeout); Faz a thread corrente esperar até que outra thread invoque os métodos notify() ou notifyAll() deste objeto ou um período especificado de tempo tiver decorrido. Sintaxe: void wait(long timeout, int nanos); Faz a thread corrente esperar até que outra thread invoque os métodos notify() ou notifyAll() deste objeto, ou outra thread interrompa a corrente thread, ou um período especificado de tempo tiver decorrido. Pacote: java.lang.Object (não é necessário fazer a chamada implícita deste pacote) // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgObject.java package progobject; public class ProgObject { public static void main(String[] args) throws Exception { Object objeto = new Object(); objeto = "Paulo Roberto"; System.out.println("Objeto: " + objeto); objeto = 48; System.out.println("Objeto: " + objeto); } } Resultado do Programa: Objeto: Paulo Roberto Objeto: 48 // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgObjeto.java package progobjeto; import java.util.Stack; public class ProgObjeto { public static void main(String[] args) throws Exception { Object objeto = "Paulo Roberto"; System.out.println("Objeto String: " + objeto); objeto = 48; System.out.println("Objeto Inteiro: " + objeto); Stack pilha = new Stack(); pilha.push(123); objeto = pilha.pop(); System.out.println("Objeto Pilha: " + objeto); Integer valor = objeto.hashCode(); System.out.println("Valor: " + valor); } } Resultado do Programa: Objeto String: Paulo Roberto Objeto Inteiro: 48 98 Objeto Pilha: 123 Valor: 123 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgNovoObjeto.java package prognovoobjeto; import java.util.Scanner; public class ProgNovoObjeto { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; int n; System.out.print("Numero de Objetos: "); s = entrada.nextLine(); n = Integer.parseInt(s); Object [] objeto = new Object[n]; for (int i = 0;i < n;i++) { System.out.print("Nome: "); s = entrada.nextLine(); objeto[i] = s; } for (int i = n-1;i >= 0;i--) { System.out.println("String: " + objeto[i]); } // vetor de objetos } } Exemplo para testar o programa: Número de Objetos: 4 <enter> Nome: paulo <enter> Nome: roberto <enter> Nome: gomes <enter> Nome: luzzardi <enter> String: luzzardi String: gomes String: roberto String: paulo 5.10 Classe Iterator Iterator é um padrão de projeto que permite simplificar a iteração com um conjunto de objetos, tendo como função encapsular a iteração sobre objetos, simplificando desta forma, a manipulação de uma coleção de objetos. A seguir são descritos os métodos da classe Iterator. Sintaxe: boolean hasNext(); Retorna true se a iteração possui mais elementos. Sintaxe: E next(); Retorna o próximo elemento da iteração. Sintaxe: void remove(); Remove da coleção o último elemento retornado pelo iterador. Observação: Olhe o exemplo de utilização do Iterator da próxima seção (5.11). 99 5.11 Classe LinkedHashSet LinkedHashSet é uma das implementações da interface Set (conjunto). Esta implementação estende a implementação HashSet, adicionando uma ordem de iteração nos elementos, usando o Iterator. A ordem de inserção é a ordem dos elementos do conjunto. Utiliza uma lista duplamente encadeada para manter a ordem. A seguir são descritos os principais métodos da classe LinkedHashSet (HashSet, AbstractSet, AbstractCollection, Object e Set). Sintaxe: boolean add(E elemento); Adiciona o elemento no conjunto, se ele ainda não existir. Sintaxe: boolean remove(Object objeto); Remove o objeto especificado do conjunto. Sintaxe: void clear(); Remove todos os elementos do conjunto. Sintaxe: Object clone(); Retorna um clone do conjunto para um determinado objeto. Sintaxe: boolean contains (Object objeto); Retorna true se o objeto especificado existe, caso contrário retorna false. Sintaxe: int size (); Retorna o número de elementos do conjunto. Sintaxe: boolean isEmpty (); Retorna true se o conjunto está vazio. Sintaxe: boolean equals (Object objeto); Compara dois objetos e retorna true se são iguais ou false se são diferentes. Sintaxe: int hashCode (); Retorna o hashcode do conjunto. Sintaxe: boolean removeAll (Collection <?> coleção); Remove todos os elementos da coleção. // ------------------------------------------------------------------------------------------------- Programa Principal: ProgLinkedHashSet1.java package proglinkedhashset1; import java.util.Iterator; import java.util.LinkedHashSet; public class ProgLinkedHashSet1 { public static void main(String[] args) { LinkedHashSet<String> lista = new LinkedHashSet<>(); lista.add("Ana"); lista.add("Beatriz"); lista.add("Carla"); lista.add("Debora"); lista.add("Eva"); Iterator<String> iterator = lista.iterator(); System.out.print("LinkedHashSet: ["); while (iterator.hasNext()) { System.out.print(iterator.next() + ", "); } 100 System.out.println(“\b\b]”); } } Resultado do Programa: LinkedHashSet: [Ana, Beatriz, Carla, Debora, Eva] // ------------------------------------------------------------------------------------------------- Programa Principal: ProgLinkedHashSet2.java package proglinkedhashset2; import java.util.Iterator; import java.util.LinkedHashSet; public class ProgLinkedHashSet2 { public static void main(String[] args) { LinkedHashSet<Integer> lista = new LinkedHashSet<>(); lista.add(100); lista.add(200); lista.add(300); lista.add(400); lista.add(500); int n = lista.size(); System.out.println("Número de Elementos do Conjunto: " + n); int somaTotal = 0; Iterator<Integer> iterator = lista.iterator(); System.out.print("LinkedHashSet: ["); while (iterator.hasNext()) { int elemento = iterator.next(); somaTotal = somaTotal + elemento; System.out.print(elemento + ", "); } System.out.println("\b\b]"); System.out.println("Soma Total dos Elementos do Conjunto: " + somaTotal); double media = (double) somaTotal / n; System.out.println("Média do Conjunto: " + media); } } Resultado do Programa: Número de Elementos do Conjunto: 5 LinkedHashSet: [100, 200, 300, 400, 500] Média do Conjunto: 300.0 5.12 Classe Genérica em Java É possível em Java definir e utilizar uma classe genérica. Veja o exemplo a seguir aonde há uma classe genérica “Nodo”: // -------------------------------------------------------------------------------------------------------------------- Classe Genérica: Nodo.java package progclassegenerico_1; public class Nodo <E> { private E element; public void add(E element) { this.element = element; } public E get() { 101 return element; } } // ----------------------------------------------------------------------------------------------- Programa Principal: ProgClasseGenerica_1.java package progclassegenerico_1; public class ProgClasseGenerico { public static void main(String[] args) { Nodo <Integer> inteiro = new Nodo<>(); inteiro.add(123); System.out.println("Inteiro: " + inteiro.get()); Nodo <Double> real = new Nodo<>(); real.add(123.45); System.out.println("Double: " + real.get()); Nodo <String> string = new Nodo<>(); string.add("Paulo"); System.out.println("String: " + string.get()); Nodo <Character> caracter = new Nodo<>(); caracter.add('A'); System.out.println("Caracter: " + caracter.get()); Nodo <Float> numFloat = new Nodo<>(); numFloat.add(1.23f); System.out.println("Float: " + numFloat.get()); } } Resultado do Programa: Inteiro: 123 Double: 123.45 String: Paulo Caracter: A Float: 1.23 // ------------------------------------------------------------------------------------------------------------------ Classe Genérica: Pixel.java package progclassegenerica_2; public class Pixel <E>{ private E x; private E y; private int cor; public void add(E x, E y, int cor) { this.x = x; this.y = y; this.cor = cor; } public E getX() { return this.x; } public E getY() { return this.y; } public int getCor() { return this.cor; } } 102 // ----------------------------------------------------------------------------------------------- Programa Principal: ProgClasseGenerica_2.java package progclassegenerica_2; public class ProgClasseGenerica_2 { public static void main(String[] args) { Pixel <Integer> pixelInt = new Pixel<>(); pixelInt.add(100, 200, 3); System.out.println("x: " + pixelInt.getX()); System.out.println("y: " + pixelInt.getY()); System.out.println("Cor: " + pixelInt.getCor()); Pixel <Double> pixelDouble = new Pixel<>(); pixelDouble.add(50.70, 100.80, 4); System.out.println("x: " + pixelDouble.getX()); System.out.println("y: " + pixelDouble.getY()); System.out.println("Cor: " + pixelDouble.getCor()); } } Resultado do Programa: x: 100 y: 200 Cor: 3 x: 50.7 y: 100.8 Cor: 4 5.13 Fila Prioritária (PriorityQueue) É possível em Java definir e utilizar uma Fila com Prioridade através da classe PriorityQueue, ou seja, definir a ordem de retirada da Fila. PriorityQueue é uma Fila que possui uma forma prioritária na remoção dos seus elementos, ou seja, esta forma pode ser ascendente (crescente) ou descendente (decrescente) Veja exemplo ProgPriorityQueue abaixo. A seguir são descritos os principais construtores e métodos da classe PriorityQuere. Construtores PriorityQueue() Cria uma PriorityQueue com capacidade de 11 elementos de acordo com uma ordem natural dos seus elementos. PriorityQueue(Collection <? extends E> c) Cria uma PriorityQueue contebdo os elementos de uma coleção. PriorityQueue(Comparator <? Super E> comparator) Cria uma PriorityQueue com capacidade inicial padrão e cujos elementos são ordenados de acordo com o comparador especificado. PriorityQueue(int capacidadeInicial) Cria uma PriorityQueue com capacidade inicial especificada que ordena os elementos de acordo com sua Ordem natural. PriorityQueue(int capacidadeInicial, Comparator<? Super E> comparator) 103 Cria uma PriorityQueue com capacidade inicial especificada que ordena os elementos de acordo com o comparador especificado. PriorityQueue(PriorityQueue<? Extends E> c) Cria uma PriorityQueue contendo os elementos da PriorityQueue especificada. PriorityQueue(SortedSet<? Extends E> c) Cria uma PriorityQueue contendo os elementos da SortedSet especificada. Sintaxe: public boolean add(E element); Insere o elemento na Fila de Prioridade. Sintaxe: void clear(); Remove todos os elementos da PriorityQueue. Sintaxe: Comparator <? super E> comparator (); Retorna um comparador utilizado para ordenar os elementos da fila ou null se esta fila é classificada de acordo com a ordenação natural de seus elementos. Sintaxe: boolean contains(Object objeto); Retorna true se a Fila contém o objeto especificado. Sintaxe: Iterator <E> iterator (); Retorna um iterador sobre os elementos da Fila. Sintaxe: boolean offer (E element); Insere o elemento especificado na PriorityQueue. Sintaxe: E peek (); Recupera, mas não remove, o primeiro da Fila ou retorna null se a Fila está vazia. Sintaxe: E poll (); Recupera e remove o primeiro da Fila ou retorna null se a Fila está vazia. Sintaxe: boolean remove (Object objeto); Remove uma instância do objeto especificado desta Fila, se ele existir na Fila. Sintaxe: int size (); Retorna o número de elementos desta coleção. Sintaxe: Object [] toArray (); Retorna um array contendo todoso os elementos da Fila. Sintaxe: <T> T[] toArray (T[] array); Retorna um array contendo todos os elementos desta Fila; o tipo retornado é o mesmo tipo do array especificado. // ----------------------------------------------------------------------------------------------- Programa Principal: ProgFilaPrioridade.java package progfilaprioridade; import java.util.PriorityQueue; public class ProgFilaPrioridade { public static void main(String[] args) { PriorityQueue fila = new PriorityQueue(); // aloca 11 elementos fila.offer(20); fila.offer(40); fila.offer(10); fila.offer(30); System.out.println("Fila: " + fila); System.out.println("Menor Elemento Prioritário: " + (Integer) fila.poll()); System.out.print("PriorityQueue: ["); while (!fila.isEmpty()) { Integer nodo = (Integer) fila.poll(); System.out.print(nodo + ", "); } 104 // remove o menor elemento System.out.println("\b\b]"); } } Resultado do Programa: Fila: [10, 30, 20, 40] Menor Elemento Prioritário: 10 PriorityQueue: [20, 30, 40] A seguir, o programa exemplo, mostra uma Fila de Prioridade com prioridade do mais VELHO ao mais MOÇO. // ----------------------------------------------------------------------------------------------- Classe: Pessoa.java package progpriorityqueue; class Pessoa { // --------------------------------------------------------- atributos da classe private String nome; public int idade; // --------------------------------------------------------- construtor public Pessoa(String nome, int idade) { this.nome = nome; this.idade = idade; } @Override public String toString() { return("[" + nome + " tem " + idade + " anos]"); } } // ----------------------------------------------------------------------------------------------- Programa Principal: ProgPriorityQueue.java package progpriorityqueue; import java.util.PriorityQueue; public class ProgPriorityQueue { public static void main(String[] args) { // ordem descendente PriorityQueue <Pessoa> fila = new PriorityQueue<>((Pessoa p1, Pessoa p2) -> p2.idade - p1.idade); // ordem ascendente // PriorityQueue <Pessoa> fila = new PriorityQueue<>((Pessoa p1, Pessoa p2) -> p1.idade - p2.idade); fila.offer(new Pessoa("Paulo Roberto", 52)); fila.offer(new Pessoa("Renato Luis", 49)); fila.offer(new Pessoa("Ana Maria", 56)); fila.offer(new Pessoa("Francisco Carlos", 54)); fila.offer(new Pessoa("Julia Helena", 55)); System.out.println("Fila Prioritária: " + fila); while (!fila.isEmpty()) { System.out.println(fila.poll()); } } } Resultado do Programa: Fila Prioritária: [[Ana Maria, 56 anos], [Julia Helena, 55 anos], [Paulo Roberto, 52 anos], [Renato Luis, 49 anos], [Francisco Carlos, 54 anos]] [Ana Maria, 56 anos] [Julia Helena, 55 anos] 105 [Francisco Carlos, 54 anos] [Paulo Roberto, 52 anos] [Renato Luis, 49 anos] 106 6. Listas Lineares: Pilhas, Filas e Deques A seguir é visto a implementação de uma Pilha, uma Fila e um Deque implementados utizando as classes existentes em Java: Stack, Queue e ArrayDeque. Pilha: Estrutura linear organizada de forma que a entrada e a saída dos dados é feita na mesma extremidade (Figura 6). Forma de acesso: LIFO (Last Input First Output), ou seja, o último elemento a entrar na pilha é o primeiro a sair dela. Fila: Estrutura linear organizada de forma que a entrada dos dados é feita por uma extremidade da lista linear e, a saída, é feita na outra extremidade (Figura 6). Forma de acesso: FIFO (First Input First Output), ou seja, o primeiro elemento a entrar na fila é o primeiro a sair da fila. Figura 6: Representação de uma Fila e uma Pilha Funcionamento da Pilha acima: Entrada: 10, 20 e 30 (push) Saída: 30, 20 e 10 (pop) Funcionamento da Fila acima: Entrada: 10, 20 e 30 (insereFila) Saída: 10, 20 e 30 (removeFila) 6.1 Implementação de uma Pilha (Stack) 107 A seguir é mostrado a implementação de Pilha usando a classe Pilha e Stack (escrita pelo programador). Programa exemplo: Permite inserir números inteiros em uma Pilha usando uma classe Pilha implementada pelo programador. Quando o número digitado for igual à zero (0), todos os números da pilha são listados. // -------------------------------------------------------------------------------------------------------------------------------------- Classe: Pilha.java package progpilha; public class Pilha { // ----------------------------------------------- atributos da classe private int topo; private final int[] dados; // ----------------------------------------------- construtor Pilha(int numElementos) { dados = new int[numElementos]; topo = -1; } // ------------------------------------------------ push public void push(int i) { int max = dados.length - 1; if (topo < max) { topo++; dados[topo] = i; } else { System.out.println("Erro: Pilha Cheia"); } } // ------------------------------------------------ pop public int pop() { if (topo != 0) { int valor = dados[topo]; topo--; return (valor); } else { return (0); } } // ------------------------------------------------ exibe public void exibePilha() { System.out.print("Pilha: ["); for (int i = 0; i <= topo; i++) { System.out.print(dados[i] + ", "); } if (topo == -1) { System.out.println("]"); } else { System.out.println("\b\b]"); } } } // ----------------------------------------------------------------------------------------------------------------- Programa Principal: ProgPilha.java package progpilha; import java.util.Scanner; public class ProgPilha { 108 public static void main(String[] args) { Pilha pilha = new Pilha(5); Scanner entrada = new Scanner(System.in); String s; int nodo; do { pilha.exibePilha(); System.out.print("Elemento: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) pilha.push(nodo); } while (nodo != 0); pilha.exibePilha(); } } Exemplo para testar o programa: Pilha: [] Elemento: 10 <enter> Pilha: [10] Elemento: 20 <enter> Pilha: [10, 20] Elemento: 30 <enter> Pilha: [10, 20, 30] Elemento: 40 <enter> Pilha: [10, 20, 30, 40] Elemento: 50 <enter> Pilha: [10, 20, 30, 40, 50] Elemento: 60 <enter> Erro: Pilha Cheia Pilha: [10, 20, 30, 40, 50] Elemento: 0 Pilha: [10, 20, 30, 40, 50] 109 Stack (Pilha) import java.util.Stack; A classe Stack é utilizada para armazenar elementos em uma Pilha. A seguir são descritos os principais métodos da classe Stack. Sintaxe: boolean isEmpty(); Testa se a pilha está vazia. Sintaxe: Object peek(); Verifica o objeto que está no topo da pilha sem removê-lo da pilha. Sintaxe: Object pop(); Remove o objeto do topo da pilha e retorna o valor do objeto. Sintaxe: Object push(Object objeto); Insere o objeto no topo da pilha. Sintaxe: int search(Object objeto); Retorna a posição que o objeto se encontra da pilha. Programa Exemplo: Mostra uma pilha utilizando a classe Stack e seus principais métodos de manipulação. // ---------------------------------------------------------------------------------------------------------------- Programa Principal: ProgStack2.java package progstack2; import java.util.Scanner; import java.util.Stack; public class ProgStack2 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); int nodo, n = 0; do { System.out.print("Nodo: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { pilha.push(nodo); n++; } } while (nodo != 0); System.out.println("Stack: " + pilha); String extenso = ""; while (!pilha.empty()) { extenso = extenso + pilha.pop() + ", "; } if (n == 0) { extenso = "]"; } else { extenso = extenso + "\b\b]"; } System.out.println("Pilha: [" + extenso); } } Exemplo para testar o programa: 110 Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 60 <enter> Nodo: 0 <enter> Stack: [10, 20, 30, 40, 50, 60] Pilha: [60, 50, 40, 30, 20, 10] Programa Exemplo: Mostra uma pilha utilizando a classe Stack e seus principais métodos de manipulação. A diferença do programa ProgStack2 é a forma de retirar e imprimir os elementos da Pilha. No ProgStack2 foi utilizado uma String, no ProgStack3, foi usado um cast para Integer. // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgStack3.java package progstack3; import java.util.Scanner; import java.util.Stack; public class ProgStack3 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); int nodo, n = 0; do { System.out.print("Nodo: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { pilha.push(nodo); n++; } } while (nodo != 0); System.out.println("Stack: " + pilha); System.out.print("Pilha: ["); while (!pilha.empty()) { Integer info = (Integer) pilha.pop(); System.out.print(info + ", "); } System.out.println("\b\b]"); // cast para Integer } } Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 60 <enter> Nodo: 0 <enter> Stack: [10, 20, 30, 40, 50, 60] Pilha: [60, 50, 40, 30, 20, 10] Programa Exemplo: Uma pilha utilizando a classe Stack e alguns dos seus métodos, permitindo procurar um elemento na pilha e retornando sua posição. Considere que a primeira posição é zero (0). // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgStack.java 111 package progstack; import java.util.Scanner; import java.util.Stack; public class ProgStack { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); int valor; do { System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { pilha.push(valor); } } while (valor != 0); do { System.out.print("Procurar: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { int posicao = pilha.search(valor); // procura elemento que contém o “valor” if (posicao == -1) { System.out.println("ERRO: Elemento não encontrado"); } else { System.out.println("Posição: " + posicao); } } } while (valor != 0); } } 112 Exemplo para testar o programa: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 40 <enter> Valor: 50 <enter> Valor: 0 <enter> Procurar: 30 <enter> Posição: 3 Procurar: 80 <enter> ERRO: Elemento não encontrado Procurar: 0 <enter> 6.2 Implementação de uma Fila (Queue) A seguir é visto uma implementação de uma Fila usando a classe Fila e Queue (LinkedList). Programa exemplo: Permite inserir números inteiros em uma Fila utilizando uma classe Fila implementada pelo programador. Quando o número digitado for igual à zero (0), todos os números da fila são listados. // -------------------------------------------------------------------------------------------------------------------------------------------- Classe: Fila.java package progfila; public class Fila { // ---------------------------------------- atributos da classe private int inic, fim, n; private final int [] dados; // ---------------------------------------- construtor Fila(int numElementos) { inic = -1; fim = 0; n = 0; dados = new int[numElementos]; } // ------------------------------------------------ insereFila public void insereFila(int i) { int max = dados.length; if (n < max) { dados[fim] = i; fim++; n++; } else System.out.println("Erro: Fila Cheia"); } // ------------------------------------------------ retiraFila public int retiraFila() { if (n != 0) { inic++; n--; return(dados[inic]); } else return(0); } // ------------------------------------------------ isEmptyFila public boolean isEmptyFila() { if (n != 0) { 113 return(false); } else { return(true); } } } // ----------------------------------------------------------------------------------------------------------- Programa Principal: ProgFila.java package progfila; import java.util.Scanner; public class ProgFila { public static void main(String[] args) { Fila fila = new Fila(5); Scanner entrada = new Scanner(System.in); int nodo, nodos = 0; do { System.out.print("Elemento: "); String s = entrada.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { fila.insereFila(nodo); nodos++; } } while (nodo != 0); String extenso = ""; System.out.print("Fila: ["); nodo = fila.retiraFila(); if (nodo != 0) { extenso = extenso + nodo + ", "; } while (!fila.isEmptyFila()) { nodo = fila.retiraFila(); extenso = extenso + nodo + ", "; } if (nodos == 0) { System.out.print(extenso + "]\n"); } else { System.out.print(extenso + "\b\b]\n"); } } } 114 Exemplo para testar o programa: Elemento: 10 <enter> Elemento: 20 <enter> Elemento: 30 <enter> Elemento: 40 <enter> Elemento: 50 <enter> Elemento: 60 <enter> Erro: Fila Cheia Elemento: 0 <enter> Fila: [10, 20, 30, 40, 50] Queue (Fila) import java.util.Queue; A interface Queue é utilizada para armazenar elementos em uma Fila. A seguir são descritos os principais métodos da interface Queue. Sintaxe: E element(); Recupera, mas não remove, o primeiro da fila. Sintaxe: boolean offer(E elemento); Insere o elemento dentro desta fila, se possível. Sintaxe: E peek(); Recupera, mas não remove, o primeiro da fila, retornando null se esta fila está vazia. Sintaxe: E poll(); Recupera e remove o primeiro da fila, ou null se esta fila está vazia. Sintaxe: E remove(); Recupera e remove o primeiro da fila. Sintaxe: boolean isEmpty() Retorna true se a Fila está vazia ou false se ela não está vazia Programa Exemplo: Mostra uma fila utilizando a classe Queue e LinkedList e seus principais métodos. // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgQueue.java package progqueue; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgQueue { public static void main(String[] args) { Queue fila = new LinkedList(); // Fila é implementada como uma Lista Encadeada Simples (LinkedList) Scanner input = new Scanner(System.in); String extenso = ""; int nodo; do { System.out.print("Nodo: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { fila.offer(nodo); } } while (nodo != 0); System.out.println("Queue: " + fila); 115 if (!fila.isEmpty()) { do { extenso = extenso + fila.poll() + ", "; } while (!fila.isEmpty()); } if (extenso.equals("")) { System.out.println("Fila: []"); } else { System.out.println("Fila: [" + extenso + "\b\b]"); } } } Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 0 <enter> Queue: [10, 20, 30, 40, 50] Fila: [10 ,20, 30, 40, 50] Programa Exemplo: Mostra uma Fila utilizando a classe Queue e LinkedList e seus principais métodos. A diferença do ProgQueue é que neste os elementos são retirados da Fila usando-se um cast para Integer e não usando uma String temporária. // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgQueue2.java package progqueue2; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgQueue2 { public static void main(String[] args) { Queue fila = new LinkedList(); // Fila é implementada com uma Lista Encadeada Simples Scanner input = new Scanner(System.in); Integer nodo; do { System.out.print("Nodo: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { fila.offer(nodo); } } while (nodo != 0); System.out.println("Queue: " + fila); System.out.print("Fila: ["); if (!fila.isEmpty()) { do { nodo = (Integer) fila.poll(); System.out.print(nodo + ", "); } while (!fila.isEmpty()); System.out.println("\b\b]"); } else { System.out.println("]"); } // cast para Integer } } 116 Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 0 <enter> Queue: [10, 20, 30, 40, 50] Fila: [10 ,20, 30, 40, 50] Observação: No programa exemplo acima, a Fila (Queue) foi implementada como uma lista encadeada simples (LinkedList). 6.3 Implementação de um Deque (ArrayDeque) A seguir é visto uma implementação de um Deque (Figura 7) utilizando a classe Deque e ArrayDeque. Figura 7: Representação visual de um Deque Programa exemplo: Permite inserir números inteiros em um Deque (pelos lados esquerdo ou direito) utilizando uma classe Deque implementada pelo programador. Para finalizar a entrada dos dados, digite zero (0). // ---------------------------------------------------------------------------------------------------------------------------------------- Classe: Deque.java package progdeque; public class Deque { private final int[] vetor; private int inic; private int fim; private int n; // --------------------------------------------------------- construtor public Deque(int numeroElementos) { inic = -1; fim = 0; n = 0; vetor = new int[numeroElementos]; } 117 // ------------------------------------------------------------ insereDequeDireita public void insereDequeDireita(int i) { int max = vetor.length; if (n < max) { vetor[fim] = i; fim++; n++; } else { System.out.println("Erro: Deque Cheia à Direita"); } } // ------------------------------------------------------------------- insereDequeEsquerda public void insereDequeEsquerda(int valor) { int max = vetor.length; if (n < max) { for (int i = n; i > 0; i--) { vetor[i] = vetor[i - 1]; } vetor[0] = valor; fim++; n++; } else { System.out.println("Erro: Deque Cheia à Esquerda"); } } // ------------------------------------------------ retiraDequeDireita public int retiraDequeDireita() { if (n != 0) { fim--; int valor = vetor[fim]; n--; return (valor); } else { return (0); } } // ---------------------------------------------------- retiraDequeEsquerda public int retiraDequeEsquerda() { if (n != 0) { inic++; n--; return (vetor[inic]); } else { return (0); } } // -------------------------------------------------- emptyDeque public boolean emptyDeque() { if (n == 0) { return (true); } else { return (false); } } // -------------------------------------------------- exibeDeque public void exibeDeque() { System.out.print("Deque: ["); if (n == 0) { System.out.println("]"); } else { for (int i = 0; i < n; i++) { 118 System.out.print(vetor[i] + ", "); } System.out.println("\b\b]"); } } } // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgDeque.java package progdeque; import java.util.Scanner; public class ProgDeque { public static void main(String[] args) { Deque deque = new Deque(5); Scanner input = new Scanner(System.in); int nodo; char op; do { deque.exibeDeque(); System.out.print("Elemento: "); String s = input.nextLine(); nodo = Integer.parseInt(s); if (nodo != 0) { do { System.out.print("[E]squerda ou [D]ireita: "); s = input.nextLine(); op = s.charAt(0); } while ("EeDd".indexOf(op) == -1); if (nodo != 0) { switch (op) { case 'E': case 'e': deque.insereDequeEsquerda(nodo); break; case 'D': case 'd': deque.insereDequeDireita(nodo); break; } } } } while (nodo != 0); do { int esquerda = deque.retiraDequeEsquerda(); if (esquerda == 0) { System.out.println("Deque: Vazia à esquerda"); } else { System.out.println("Esquerda: " + esquerda); } int direita = deque.retiraDequeDireita(); if (esquerda == 0) { System.out.println("Deque: Vazia à direita"); } else { System.out.println("Direita: " + direita); } } while (!deque.emptyDeque()); } } Exemplo para testar o programa: Deque: [] Elemento: 10 <enter> 119 [E]squerda ou [D]ireita: e <enter> Deque: [10] Elemento: 20 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20] Elemento: 30 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20, 30] Elemento: 40 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20, 30, 40] Elemento: 50 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20, 30, 40, 50] Elemento: 60 <enter> [E]squerda ou [D]ireita: d <enter> Erro: Deque Cheia à Direita Deque: [10, 20, 30, 40, 50] Elemento: 60 <enter> [E]squerda ou [D]ireita: e <enter> Erro: Deque Cheia à Esquerda Deque: [10, 20, 30, 40, 50] Elemento: 0 <enter> Esquerda: 10 Direita: 50 Esquerda: 20 Direita: 40 Esquerda: 30 Direita: 0 Java possui classes pré-definidas para trabalhar com Deque: ArrayDeque, LinkedBlockingDeque e LinkedList. Construtores: ArrayDeque() Construi um deque em um array vazio com 16 elementos. ArrayDeque(int numeroElements); Construi um deque em um array vazio com numeroElements elementos. A seguir são descritos os métodos da classe ArrayDeque. Sintaxe: boolean add(E elemento); Insere o elemento no fim do deque. Sintaxe: void addFirst(E elemento); Insere o elemento no início do deque. Sintaxe: void addLast(E elemento); Insere o elemento do final do deque. Sintaxe: void clear(); Remove todos os elementos do deque. Sintaxe: ArrayDeque<E> clone(); Retorna uma cópia do deque. Sintaxe: boolean contains(Object objeto); Retorna true se o deque contém o objeto. Sintaxe: Iterator<E> descendingIterator(); Retorna um iterator sobre os elementos no deque em ordem sequencial reversa. Sintaxe: E element(); 120 Recupera, mas não remove, o elemento corrente da fila representada pelo deque. Sintaxe: E getFirst(); Recupera, mas não remove, o primeiro elemento do deque. Sintaxe: E getLast(); Recupera, mas não remove, o último elemento do deque. Sintaxe: boolean isEmpty(); Retorna true se o deque não contém elementos. Sintaxe: Iterator <E> iterator(); Retorna o iterator sobre os elementos do deque. Sintaxe: boolean offer(E elemento); Insere o elemento no fim do deque. Sintaxe: boolean offerFirst(E elemento); Insere o elemento no início do deque. Sintaxe: boolean offerLast(E elemento); Insere o elemento no final do deque. Sintaxe: E peek(); Recupera, mas não remove, o elemento corrente da fila representada pelo deque ou retorna null se o deque está vazio. Sintaxe: E peekFirst(); Recupera, mas não remove, o primeiro elemento do deque, ou retorna null se o deque está vazio. Sintaxe: E peekLast(); Recupera, mas não remove, o último elemento do deque ou retorna null se o deque está vazio. Sintaxe: E poll(); Recupera e remove o elemento corrente da fila representada pelo deque ou retorna null se este deque está vazio. Sintaxe: E pollFirst(); Recupera e remove o primeiro elemento do deque ou retorna null se o deque está vazio. Sintaxe: E pollLast(); Recupera e remove o último elemento do deque ou retorna null se o deque está vazio. Sintaxe: E pop(); Retira um elemento na pilha representada por este deque. Sintaxe: void push(E elemento); Insere um elemento na pilha representada por este deque. Sintaxe: E remove(); Recupera e remove o cabeça da fila representado por este deque. Sintaxe: boolean remove(Object objeto); Remove a instância de um objeto deste deque. Sintaxe: E removeFirst(); Recupera e remove o primeiro elemento do deque. Sintaxe: boolean removeFirstOccurrence(Object objeto); Remove a primeira ocorrência do objeto do deque (quando percorre o deque do primeiro ao último). Sintaxe: E removeLast(); Recupera e remove o último elemento do deque. Sintaxe: boolean removeLastOccurrence(Object objeto); Remove a última ocorrência do objeto do deque (quando percorre o deque do primeiro ao último). Sintaxe: int size(); Retorna o número de elementos do deque. 121 Sintaxe: Object[] toArray(); Retorna um array contendo todos os elementos do deque em ordem crescente (do primeiro até o último elemento). Sintaxe: <T> T[] toArray(T[] array); Retorna um array contendo todos os elementos do deque em ordem crescente (do primeiro até o último elemento); o tipo do array retornado é aquele especificado pelo array. A seguir é demonstrado a utilização de um Deque através da classe ArrayDeque e seus principais métodos. Pacote: import java.util.ArrayDeque; // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgArrayDeque.java package progarraydeque; import java.util.ArrayDeque; import java.util.Scanner; public class ProgArrayDeque { public static void main(String[] args) { ArrayDeque deque = new ArrayDeque(); Scanner entrada = new Scanner(System.in); String s; char tecla = 'f', op = 'f'; int = 0; Integer nodo; // aloca com 16 elementos do { System.out.println("Deque: " + deque); System.out.print("[I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: "); do { s = entrada.nextLine(); if (!s.equals("")) { tecla = s.charAt(0); } } while (!strChr("IiCcEeFf", tecla)); if (!strChr("Ff", tecla)) { System.out.print("[E]squerda ou [D]ireita: "); do { s = entrada.nextLine(); if (!s.equals("")) { op = s.charAt(0); } } while (!strChr("EeDd", op)); switch (tecla) { case 'I': case 'i': System.out.print("Nodo: "); s = entrada.nextLine(); nodo = Integer.parseInt(s); if (strChr("Ee", op)) { deque.addFirst(nodo); } else { deque.addLast(nodo); } n++; if (n > 16) { System.out.println("ERRO: Deque Cheio"); System.exit(1); } break; case 'C': case 'c': if (!deque.isEmpty()) { if (strChr("Ee", op)) { 122 nodo = (Integer) deque.peekFirst(); } else { nodo = (Integer) deque.peekLast(); } System.out.println("Consultado: " + nodo); } else { System.out.println("ERRO: Deque Vazio"); } break; case 'E': case 'e': if (!deque.isEmpty()) { if (strChr("Ee", op)) { nodo = (Integer) deque.pollFirst(); } else { nodo = (Integer) deque.pollLast(); } System.out.println("Excluiu: " + nodo); n--; } else { System.out.println("ERRO: Deque Vazio"); } break; // cast // cast } } } while (!strChr("Ff", tecla)); } // --------------------------------------------------------------- strChr static boolean strChr(String s, char tecla) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charAt(i) == tecla) { return(true); } } return(false); } } Exemplo para testar o programa: Deque: [] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i <enter> [E]squerda ou [D]ireita: e <enter> Nodo: 10 <enter> Deque: [10] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i <enter> [E]squerda ou [D]ireita: d <enter> Nodo: 20 <enter> Deque: [10, 20] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i <enter> [E]squerda ou [D]ireita: d <enter> Nodo: 30 <enter> Deque: [10, 20, 30] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: f <enter> 6.4 Lista de Exercícios: Listas Lineares (Pilhas, Filas e Deques) 6.4.1 Escreva um programa em Java que leia um nome via teclado. Logo após a entrada utilize uma Pilha (caracteres) para armazenar as letras da abreviatura deste nome. Exiba a abreviatura invertida do nome extraída da pilha, a pilha vazia e ainda o número de letras da abreviatura, conforme exemplo abaixo. 123 Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Abreviatura: LGRP Pilha: [] Total de Letras: 4 6.4.2 Escreva um programa em Java que leia um nome via teclado. Logo após a entrada utilize uma Fila (caracteres) para armazenar e exibir (na tela do computador) todos os carateres deste nome SEM ESPAÇOS EM BRANCO e ainda o número de espaços eliminados na exibição, conforme exemplo abaixo. Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Nome Modificado: paulorobertogomesluzzardi Número de Espaços eliminados: 3 6.4.3 Escreva um programa em Java que lê nomes via teclado. Para cada nome digitado pelo usuário, armazene em uma Pilha [f] para feminino, [m] para masculino ou [i] para indeterminado, conforme exemplo abaixo. Ao final imprima a Pilha, o total de homens, o total de mulheres e o total de indeterminados. Entrada: Nome: Debora <enter> Nome: Carla <enter> Nome: Beatriz <enter> Nome: Paulo <enter> Nome: Renato <enter> Nome: <enter> Saída: Pilha: [m, m, i, f, f] 2 homens 2 mulheres 1 indeterminados 6.4.4 Escreva um programa em Java que recebe “n” nomes via teclado (até que o usuário digite apenas <enter>). Insira todos os nomes ORDENADOS em uma Fila de Strings (conforme exemplo abaixo). Ao final, o programa deve exibir a Fila contendo os nomes em ordem alfabética (a saída dos dados deve ser exatamente igual ao exemplo abaixo). Entrada: Nome: Debora <enter> Nome: Carla <enter> Nome: Eva <enter> Nome: Beatriz <enter> Nome: Ana <enter> Nome: <enter> Saída: Fila: [Ana, Beatriz, Carla, Debora, Eva] 6.4.5 Escreva um programa em Java que recebe via teclado: valor e quantidade. O programa deve inserir ambos valores em uma Fila (conforme exemplo abaixo). Ao final, o programa deve exibir a Fila e após extrair todos os valores e quantidades imprimindo-os na tela conforme suas quantidades (conforme exemplo abaixo) e ainda o total de valores impressos. Entrada: Saída: Valor: 10 <enter> Quantidade: 3 <enter> Valor: 20 <enter> Quantidade: 4 <enter> Valor: 30 <enter> Quantidade: 2 <enter> Valor: 0 <enter> // saída do programa Fila: [10, 3, 20, 4, 30, 2] Saída: 10 10 10 20 20 20 20 30 30 Total de Valores Impressos: 9 124 6.4.6 Escreva um programa em Java que recebe “n” nomes via teclado (até que o usuário digite apenas <enter>). Para cada nome digitado, insira a quantidade de caracteres de cada palavra em uma Pilha de inteiros (conforme exemplo abaixo). Ao final, o programa deve exibir: (a) Pilha criada com as referidas quantidades, o total de caracteres contidos na pilha de quantidades, o total de nomes digitadas pelo usuário e a pilha vazia após as contagens (a saída dos dados deve ser exatamente igual ao exemplo abaixo). Entrada: Nome: Paulo <enter> Nome: Roberto <enter> Nome: Gomes <enter> Nome: Luzzardi <enter> Nome: <enter> Saída: Pilha: [5 7 5 8] Total de Caracteres: 25 letra(s) Total de Nomes: 4 Pilha: [] 6.4.7 Escreva um programa em Java que lê um nome qualquer via teclado. Logo após a entrada utilize uma Pilha (caracteres) e uma Fila (caracteres) para armazenar apenas as consoantes (Fila) e as vogais (Pilha) deste nome, respectivamente. Exiba a Fila e a Pilha gerada, conforme exemplo abaixo. Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Fila: [p, l, r, b, r, t, g, m, s, l, z, z, r, d] Pilha: [i, a , u , e , o , o , e , o , o , u, a] 6.4.8 Escreva um programa em Java que lê um nome qualquer via teclado. Logo após a entrada utilize uma pilha ou uma fila (caracteres) para exibir o nome invertido, conforme exemplo abaixo. Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Nome Invertido: idrazzul semog otrebor oluap 6.4.9 Escreva um programa em Java que lê um nome via teclado. Logo após a entrada utilize uma Pilha (caracteres) e uma Fila (caracteres) para armazenar apenas as consoantes (Fila) e as vogais (Pilha) deste nome, respectivamente. Exiba a Fila, o total de consoantes, Pilha, o total de vogais e o total de letras, exatamente conforme o exemplo abaixo. Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Fila: [p, l, r, b, r, t, g, m, s, l, z, z, r, d] Total de Consoantes: 14 Fila: [] Pilha: [a, u, o, o, e, o, o, e, u, a, i] Total de Vogais: 11 Pilha: [] Total de Letras: 25 6.4.10 Escreva um programa em Java que lê um nome qualquer via teclado. Logo após a entrada utilize uma Fila para inserir todas as palavras no nome e uma Pilha para armazenar apenas iniciais de cada palavra do nome. Exiba a Fila e a Pilha gerada, conforme exemplo abaixo. Entrada: Nome: Paulo Roberto Gomes Luzzardi <enter> Saída: Fila: [Paulo, Roberto, Gomes, Luzzardi] <- fim da fila Pilha: [P, R, G, L] <- topo da pilha 6.4.11 Implemente um programa em Java que possui duas pilhas: p1 e p2. Insira “n” números na pilha (p1), para cada valor inserido na pilha (p1), duplique e armazene o valor na segunda pilha (p2). Quando o usuário 125 digitar 0 (zero), o programa deve imprimir ambas as pilhas e o conteúdo das duas pilhas em ordem crescente. Entrada: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 0 <enter> Saída: p1: [10, 20, 30] p2: [20, 40, 60] Pilhas: 10 20 20 30 40 60 30 20 10 p1 60 40 20 p2 6.4.12 Implemente um programa em Java que possui duas filas: f1 e f2. Insira “n” números na fila (f1) até que o usuário digite 0 (zero). O programa deve então excluir todos os valores da fila (f1) e inseri-los na fila (f2) triplicando cada valor. Ao final o programa deve imprimir ambas as filas, o maior e o menor valor de ambas as filas. Entrada: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 0 <enter> Saída: f1: [] f2: [30, 60, 90] Maior: 90 Menor: 10 30 20 10 f1 90 60 30 f2 6.4.13 Escreva um programa em Java que lê uma palavra via teclado. Logo após a entrada utilize uma pilha para inverter e exibir esta palavra na tela e ainda o número de letras da palavra (conforme exemplo abaixo). Entrada: Palavra: pelotas <enter> Saída: Palavra Invertida: satolep Total de Letras: 7 6.4.14 Escreva um programa em Java que recebe via teclado: valor inicial, valor final e intervalo. O programa deve inserir “n” valores em uma Fila (desde o valor inicial até o valor final levando em consideração o intervalo entre eles)(conforme exemplo abaixo). Ao final, o programa deve exibir a Fila criada com estes valores. O programa acaba quando o valor inicial for igual a zero. Exemplo para testar o programa: Valor Inicial: 10 <enter> Valor Final: 70 <enter> Intervalo: 10 <enter> Fila: [10, 20, 30, 40, 50, 60, 70] Valor Inicial: 60 <enter> Valor Final: 20 <enter> Intervalo: 5 <enter> Fila: [60, 55, 50, 45, 40, 35, 30, 25, 20] Valor Inicial: 0 <enter> 6.4.15 Escreva um programa em Java que recebe “n” valores inteiros via teclado. O programa deve inserir cada inteiro em uma Pilha (Stack) e dobrar o valor e inserir em uma Fila (Queue). Ao final, o programa deve exibir na tela todas as informações contidas no exemplo abaixo. O programa termina quando o usuário digitar zero (0) na entrada das informações. Entrada: Nodo: 100 <enter> Nodo: 200 <enter> Nodo: 300 <enter> Nodo: 0 <enter> 126 Saída: Pilha: [100, 200, 300] Topo da Pilha: 300 Base da Pilha: 100 Número de Elementos da Pilha: 3 Fila: [200, 400, 600] Primeiro Elemento da Fila: 200 Número de Elementos da Fila: 3 ou Entrada: Nodo: 0 <enter> Saída: Pilha: [] Fila: [] 127 7. Mapas (Maps) 7.1 Conceitos básicos sobre Mapas Maps associam chaves à valores, onde as chaves devem ser únicas, mas os valores não. Maps utilizam o conceito de Tabelas Hash (Figura 8), onde as Tabelas Hash são estruturas que permitem associar uma chave a um valor. Elas permitem acesso aos valores através de sua chave associada. Uma chave é calculada através de uma função em uma posição na Tabela Hash. Tanto a localização (armazenamento) e a recuperação da chave é feita da mesma forma, ou seja, através de um cálculo matemático. Figura 8: Representação gráfica de uma Tabela Hash (Hashtable) Java utiliza a classe HashTable para manipular este tipo de estrutura de dados complexa. Para manipular elementos na tabela Hash, são usados os seguintes métodos: Sintaxe: public V put(K chave, V valor); Armazena um par de objetos na tabela Hash. Sintaxe: public V get(Object chave) Retorna o objeto associado ao objeto chave. Sintaxe: public V remove(Object chave); Remove o par de objetos com a chave. Sintaxe: public boolean containsKey(Object chave). Consulta se uma determinada chave existe na tabela. Sintaxe: public boolean contains(Object valor); Verifica se um determinado valor está presente na tabela associado a qualquer chave. Sintaxe: public int size(); Retorna o número de pares de elementos na tabela. Alguns tipos de Maps: HashTable (ordem ascendente), HashMap (ordem ascendente), TreeMap (ordem ascendente) e LinkedHashMap (ordem de inclusão). Exemplos de Mapas com HashTable: (Observação: pacote obsoleto) // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgHashTable.java package proghashtable; import java.util.Hashtable; public class ProgHashTable { public static void main(String args[]) { 128 Hashtable pessoa = new Hashtable(); pessoa.put(20, "Beatriz"); // chave, valor pessoa.put(30, "Carla"); // chave, valor pessoa.put(10, "Ana"); // chave, valor System.out.println("Tamanho da Hashtable: " + pessoa.size()); System.out.println("Tabela Hash: " + pessoa.toString()); pessoa.clear(); } } Resultado do Programa: Tamanho da Hashtable: 3 Tabela Hash: {10=Ana, 20=Beatriz, 30=Carla} Exemplos de Mapas com HashMap: // ------------------------------------------------------------------------------------------------------------ Programa Principal: ProgMap1.java package progmap1; import java.util.HashMap; import java.util.Map; public class ProgMap1 { public static void main(String[] args) { Map <Integer, String> mapa = new HashMap<>(); mapa.put(2, "Beatriz"); mapa.put(5, "Eva"); mapa.put(1, "Ana"); mapa.put(3, "Carla"); mapa.put(4, "Debora"); System.out.println("Mapa: " + mapa.toString()); } } Resultado do Programa: Mapa: {1=Ana, 2=Beatriz, 3=Carla, 4=Debora, 5=Eva} // ---------------------------------------------------------------------------------------------------------- Programa principal: ProgMap2.java package progmap2; import java.util.HashMap; import java.util.Map; public class ProgMap2 { public static void main(String[] args) { Map <Integer, String> mapa = new HashMap<>(); mapa.put(4, "Debora"); mapa.put(2, "Beatriz"); mapa.put(5, "Eva"); mapa.put(1, "Ana"); mapa.put(3, "Carla"); System.out.println("Chaves: " + mapa.keySet()); System.out.println("Valores: " + mapa.values()); } } Resultado do Programa: Chaves: [1, 2, 3, 4, 5] Valores: [Ana, Beatriz, Carla, Debora, Eva] 129 // ----------------------------------------------------------------------------------------------------------- Programa Principal: ProgMap3.java package progmap3; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; public class ProgMap3 { public static void main(String[] args) { Map <String, Integer> mapa = new HashMap<>(); mapa.put("Eva", 5); mapa.put("Beatriz", 2); mapa.put("Carla", 3); mapa.put("Ana", 1); mapa.put("Debora", 4); Set <String> keys = mapa.keySet(); // carrega as chaves TreeSet <String> sortedkeys = new TreeSet<> (keys); // ordena as chaves for (String key : sortedkeys) { // exibe as chaves em ordem System.out.println("Chave: " + mapa.get(key) + " | Pessoa: " + key); } } } Resultado do Programa: Chave: 1 | Pessoa: Ana Chave: 2 | Pessoa: Beatriz Chave: 3 | Pessoa: Carla Chave: 4 | Pessoa: Debora Chave: 5 | Pessoa: Eva // ----------------------------------------------------------------------------------------------------------- Programa Principal: ProgMap4.java package progmap4; import java.util.HashMap; import java.util.Map; public class ProgMap4 { public static void main(String[] args) { Map<Integer, String> mapa = new HashMap<>(); mapa.put(5, "Eva"); mapa.put(2, "Beatriz"); mapa.put(3, "Carla"); mapa.put(1, "Ana"); mapa.put(4, "Debora"); int n = mapa.size(); for (int i = 1; i <= n; i++) { System.out.println("Chave: " + i + " | Pessoa: " + mapa.get(i)); } } } Resultado do Programa: Chave: 1 | Pessoa: Ana Chave: 2 | Pessoa: Beatriz Chave: 3 | Pessoa: Carla Chave: 4 | Pessoa: Debora Chave: 5 | Pessoa: Eva // ----------------------------------------------------------------------------------------------------------- Programa Principal: ProgMap5.java 130 package progmap_5; import java.util.HashMap; import java.util.Map; public class ProgMap_5 { public static void main(String[] args) { Map<String, String> mapa = new HashMap<>(); mapa.put("E", "Eva"); mapa.put("B", "Beatriz"); mapa.put("C", "Carla"); mapa.put("A", "Ana"); mapa.put("D", "Debora"); System.out.println("Número de Elementos do Mapa: " + mapa.size()); // listando o número de elementos do mapa System.out.println("Mapa: " + mapa); // listando todo o mapa System.out.print("Chaves: "); // listando as chaves for (String st : mapa.keySet()) { System.out.print(st + " "); } System.out.print("\nValores: "); // listando os valores for (String st : mapa.values()) { System.out.print(st + " "); } System.out.println(); } } Resultado do Programa: Número de Elementos do Mapa: 5 Mapa: {D=Debora, E=Eva, A=Ana, B=Beatriz, C=Carla} Chaves: D E A B C Valores: Debora Eva Ana Beatriz Carla Exemplos de Mapas com TreeMap: // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgTreeMap.java package progtreemap; import java.util.TreeMap; public class ProgTreeMap { public static void main(String[] args) { TreeMap<String, Integer> alunos = new TreeMap<>(); alunos.put("Carla", 17); alunos.put("Debora", 18); alunos.put("Beatriz", 19); alunos.put("Ana", 20); // ordem ascendente for (String key : alunos.keySet()) { System.out.printf("%-7s -> %2d\n",key, alunos.get(key)); } System.out.println("keySet: " + alunos.keySet()); alunos.clear(); } } Resultado do Programa: Ana -> 20 Beatriz -> 19 Carla -> 17 Debora -> 18 keySet: [Ana, Beatriz, Carla, Debora] 131 // -------------------------------------------------------------------------------------------------- Programa Principal: ProgLinkedHashMap.java package proglinkedhashmap; import java.util.LinkedHashMap; public class ProgLinkedHashMap { public static void main(String[] args) { LinkedHashMap pessoa = new LinkedHashMap(); pessoa.put("Carla", 67.12); pessoa.put("Debora", 70.23); pessoa.put("Ana", 56.13); pessoa.put("Beatriz", 57.45); pessoa.put("Eva", 59.12); System.out.println("Mapa: " + pessoa.toString()); for (Object key : pessoa.keySet()) { System.out.printf("%-7s -> %.2f\n", key, pessoa.get(key)); } } } Resultado do Programa: Mapa: {Carla=67.12, Debora=70.23, Ana=56.13, Beatriz=57.45, Eva=59.12} Carla -> 67,12 Debora -> 70,23 Ana -> 56,13 Beatriz -> 57,45 Eva -> 59,12 7.2 Lista de Exercícios: Mapas 7.2.1 Escreva um programa em Java que utiliza uma LinkedHashMap e tenha o seguinte resultado: Resultado do Programa: Carla -> (2) Eva -> (4) Ana -> (0) Beatriz -> (1) Debora -> (3) Mapa: Ana Beatriz Carla Debora Eva 7.2.2 Escreva um programa em Java que utiliza uma TreeMap e tenha o seguinte resultado: Resultado do Programa: Ana -> A Beatriz -> B Carla -> C Debora -> D keySet: [Ana, Beatriz, Carla, Debora] 7.2.3 Escreva um programa em Java que utiliza uma Map e tenha o seguinte resultado: Resultado do Programa: Chave: 1 | Pessoa: Ana | Bytes: 3 Chave: 2 | Pessoa: Beatriz | Bytes: 7 Chave: 3 | Pessoa: Carla | Bytes: 5 Chave: 4 | Pessoa: Debora | Bytes: 6 Chave: 5 | Pessoa: Eva | Bytes: 3 132 7.2.4 Escreva um programa em Java que utiliza uma HashTable e tenha o seguinte resultado: Resultado do Programa: Tamanho da Hashtable: 3 Chaves: [10, 20, 30] Valor: [Ana, Beatriz, Carla] 7.2.5 Escreva um programa em Java que utiliza um Map (HashMap) e tenha o seguinte resultado: Resultado do Programa: Número de Elementos do Mapa: 5 Mapa: {D=Debora, E=Eva, A=Ana, B=Beatriz, C=Carla} Chaves: [D, E, A, B, C] Valores: [Debora, Eva, Ana, Beatriz, Carla] 133 8. Processamento de fluxos de dados, caracteres e objetos (Arquivos) Fluxos de dados ou streams são utilizados para manipulação de arquivos em Java. Arquivos são abstrações utilizadas para que um programa interaja com os dispositivos de saída, conectados ao computador, através de operações de gravação e leitura de dados. Este conceito virtual foi extraído do conceito real da utilização de arquivos físicos (armários cinzas de ferro), onde abria-se as gavetas, coloca-se e retira-se fichas de dentro dele. Java descreve um arquivo como se fosse um fluxo sequencial de caracteres (terminado por EOF – End Of File) ou bytes (pelo número total de bytes). Há dois tipos de arquivos em Java: Binário: Baseado em stream de bytes, onde um conjunto de bytes é escrito e lido do disco em blocos (Figura 11). Texto: Baseado em uma fila (stream) de caracteres (Figuras 9 e 10). Caracteres são armazenados e recuperados como uma sequência de caracteres separada por linhas terminadas por um caractere de fim de linha (\n) e uma marca no final do arquivo EOF (End Of File). Figura 9: Exemplo de um arquivo texto 134 Figura 10: Editor hexadecimal mostrando o arquivo texto Note que num arquivo texto é possível distinguir e interpretar os caracteres presentes no arquivo, ou seja, eles são codificados na linguagem natural das pessoas (texto legível visto acima à direita da Figura 10), onde cada caracter ocupa um byte na memória (8 bits). Figura 11: Editor hexadecimal mostrando o arquivo binário Note que num arquivo binário não é possível distinguir e interpretar os caracteres presentes no arquivo, ou seja, eles não são codificados na linguagem natural das pessoas (texto ilegível visto acima à direita da Figura 11) e sim como um conjunto de bytes representando cada caracter. Observação: Os códigos acima estão em hexadecimal, onde 0x41 é 65 em decimal (ou letra A), por exemplo. Em Java é possível manipular arquivos através da classe File (Arquivo). 135 8.1 Métodos para manipular arquivos em Java A seguir são descritos os principais métodos para manipular arquivos em Java: Sintaxe: boolean canRead(); Testa se o aplicativo pode ler o arquivo indicado pelo pathname (caminho). Sintaxe: boolean canWrite(); Testa se o aplicativo pode modificar o arquivo indicado pelo pathname (caminho). Sintaxe: int compareTo(File nomeCaminho); Compara dois pathnames lexicograficamente. Sintaxe: int compareTo(Object objeto); Compara o pathname com outro objeto. Sintaxe: boolean createNewFile(); Cria um novo arquivo vazio com o nome do pathname, se e somente se um arquivo com este nome ainda não existe. Sintaxe: static File createTempFile(String prefixo, String sufixo); Cria um arquivo vazio no diretório de arquivos temporários, usando o prefixo e o sufixo dado para gerar o seu nome. Sintaxe: static File createTempFile(String prefixo, String sufixo, File diretório); Cria um novo arquivo vazio no diretório especificado, usando o prefixo e o sufixo dado pela string para gerar o seu nome. Sintaxe: boolean delete(); Deleta o arquivo ou diretório informado no pathname. Sintaxe: void deleteOnExit(); Solicita que o arquivo ou diretório indicado por este pathname seja excluído quando a máquina virtual termina. Sintaxe: boolean equals(Object objeto); Testa se o pathname é igual ao objeto indicado. Sintaxe: boolean exists(); Testa se o arquivo ou diretório indicado para este pathname existe. Sintaxe: File getAbsoluteFile(); Retorna a forma absoluta do pathname. Sintaxe: String getAbsolutePath(); Retorna uma string absoluta do pathname. Sintaxe: File getCanonicalFile(); Retorna a forma canônica do pathname. Sintaxe: String getCanonicalPath(); Retorna uma string canônica do pathname. 136 Sintaxe: String getName(); Retorna o nome do arquivo ou diretório indicado pelo pathname. Sintaxe: String getParent(); Retorna uma string do caminho pai, o caminho abstrato, ou nulo se este caminho não é nome de um diretório pai. Sintaxe: File getParentFile(); Retorna o caminho abstrato pai do caminho, ou nulo se este caminho não é nome de um diretório pai. Sintaxe: String getPath(); Converte este pathname em uma string do pathname. Sintaxe: int hashCode(); Calcula o código hash para este pathname. Sintaxe: boolean isAbsolute(); Testa se este pathname é absoluto Sintaxe: boolean isDirectory(); Testa se o arquivo indicado por este caminho (pathname) é um diretório. Sintaxe: boolean isFile(); Testa se o arquivo indicado por este caminho (pathname) é um arquivo (file). Sintaxe: boolean isHidden(); Testa se o arquivo indicado por este caminho (pathname) é um arquivo escondido. Sintaxe: long lastModified(); Retorna o tempo em que o arquivo indicado por este caminho foi modificado pela última vez. Sintaxe: long length(); Retorna o comprimento do arquivo indicado pelo pathname. Sintaxe: String[] list(); Retorna um vetor de strings com os nomes dos arquivos e diretórios no diretório indicado por este caminho. Sintaxe: String[] list(FilenameFilter filtro); Retorna um vetor de strings com os nomes de arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro. Sintaxe: File[] listFiles(); Retorna um vetor de pathname indicando os arquivos no diretório indicado por este caminho. Sintaxe: File[] listFiles(FileFilter filtro); Retorna um vetor de pathname indicando os arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro. Sintaxe: File[] listFiles(FilenameFilter filtro); Retorna um vetor de pathname indicando os arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro. Sintaxe: static File[] listRoots(); Lista o sistema de arquivos disponíveis principais (root). Sintaxe: boolean mkdir(); Cria o diretório chamado por este caminho. Sintaxe: boolean mkdirs(); Cria o diretório chamado por este pathname, incluindo os diretórios pai necessários, mas inexistentes. Sintaxe: boolean renameTo(File dest); Renomeia o arquivo indicado pelo pathname. Sintaxe: boolean setLastModified(long time); Define o tempo da última modificação do arquivo ou diretório chamado por este caminho. Sintaxe: boolean setReadOnly(); Marca o arquivo ou diretório chamado por este caminho que só são permitidas operações de leitura. Sintaxe: String toString(); Retorna uma string pathname deste caminho. 137 Sintaxe: URI toURI(); Constrói um arquivo URI que representa esse caminho. Sintaxe: URL toURL(); Converte este caminho em um arquivo: URL. 8.2 Abertura de um arquivo texto A seguir são vistos alguns programas exemplos mostrando a manipulação de arquivos em Java. Programa exemplo: Abre um arquivo texto e exibe o número de bytes do referido arquivo. // -------------------------------------------------------------------------------------------------- Programa Principal: ProgAbreTexto.java package progabretexto; import java.io.File; public class ProgAbreTexto { public static void main(String[] args) { String nomeArquivo = "/Users/pluzzardi/luzzardi.txt"; File arqTexto = new File(nomeArquivo); if (arqTexto.exists()) { long bytes = arqTexto.length(); System.out.println("Arquivo: " + nomeArquivo); System.out.println("Bytes: " + bytes); } else { System.out.println("ERRO: Arquivo não existe"); } } } Resultado do Programa: Arquivo: /Users/pluzzardi/luzzardi.txt Bytes: 131 138 8.3 Listar um diretório Programa exemplo: Exibe na tela (lista) os arquivos e diretórios do pathname (caminho) especificado. // ------------------------------------------------------------------------------------------------ Programa Principal: ProgListaDiretorio.java package proglistadiretorio; import java.io.File; public class ProgListaDiretorio { public static void main(String[] args) { File diretorio = new File("//Users//pluzzardi"); String [] arquivos = diretorio.list(); for (String arquivo : arquivos) { File filho = new File(diretorio, arquivo); System.out.println(filho.getAbsolutePath()); } } } Resultado do Programa: /Users/pluzzardi/.bash_history /Users/pluzzardi/.CFUserTextEncoding /Users/pluzzardi/.config /Users/pluzzardi/.cups /Users/pluzzardi/.dropbox /Users/pluzzardi/.DS_Store /Users/pluzzardi/.gbas /Users/pluzzardi/.local /Users/pluzzardi/.netbeans-derby /Users/pluzzardi/.ssh /Users/pluzzardi/.Trash /Users/pluzzardi/.viminfo /Users/pluzzardi/Desktop /Users/pluzzardi/Documents /Users/pluzzardi/Downloads /Users/pluzzardi/Dropbox /Users/pluzzardi/frutas.luz /Users/pluzzardi/Frutas.txt /Users/pluzzardi/Leitura.zip /Users/pluzzardi/Library /Users/pluzzardi/luzzardi.dat /Users/pluzzardi/Luzzardi.txt /Users/pluzzardi/Movies /Users/pluzzardi/Music /Users/pluzzardi/NetBeansProjects /Users/pluzzardi/nomes.sort /Users/pluzzardi/nomes.txt /Users/pluzzardi/palavras.dat /Users/pluzzardi/pessoa.dat /Users/pluzzardi/pessoas.dat /Users/pluzzardi/Pictures /Users/pluzzardi/Projects /Users/pluzzardi/Public Programa exemplo: Exibe na tela (lista) os arquivos e diretórios do pathname especificado pelo usuário. // ------------------------------------------------------------------------------------- Programa Principal: ProgListaDiretorioUsuario.java package proglistadiretoriousuario; 139 import java.io.File; import java.util.Scanner; public class ProgListaDiretorioUsuario { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.print("Pathname: "); String nomeDiretorio = entrada.nextLine(); File diretorio = new File(nomeDiretorio); String [] arquivos = diretorio.list(); for (int i = 0;i < arquivos.length;i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); } } } Resultado do Programa: Pathname: /Users/pluzzardi /Users/pluzzardi/.bash_history /Users/pluzzardi/.CFUserTextEncoding /Users/pluzzardi/.config /Users/pluzzardi/.cups /Users/pluzzardi/.dropbox /Users/pluzzardi/.DS_Store /Users/pluzzardi/.gbas /Users/pluzzardi/.local /Users/pluzzardi/.netbeans-derby /Users/pluzzardi/.ssh /Users/pluzzardi/.Trash /Users/pluzzardi/.viminfo /Users/pluzzardi/Desktop /Users/pluzzardi/Documents /Users/pluzzardi/Downloads /Users/pluzzardi/Dropbox /Users/pluzzardi/frutas.luz /Users/pluzzardi/Frutas.txt /Users/pluzzardi/Leitura.zip /Users/pluzzardi/Library /Users/pluzzardi/luzzardi.dat /Users/pluzzardi/Luzzardi.txt /Users/pluzzardi/Movies /Users/pluzzardi/Music /Users/pluzzardi/NetBeansProjects /Users/pluzzardi/nomes.sort /Users/pluzzardi/nomes.txt /Users/pluzzardi/palavras.dat /Users/pluzzardi/pessoa.dat /Users/pluzzardi/pessoas.dat /Users/pluzzardi/Pictures /Users/pluzzardi/Projects /Users/pluzzardi/Public 8.4 Manipulação de um arquivo de palavras A seguir são mostrados alguns programas exemplos que manipulam um arquivo contendo palavras (palavras.dat). Veja o formato no exemplo abaixo: 5 carambola 140 beringela abacate ervilha damasco Programa exemplo: Permite criar um arquivo de palavras (palavras.dat) permitindo a gravação destas palavras no arquivo. // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgCriaPalavras.java package progcriapalavras; import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class ProgCriaPalavras { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); if (!arquivo.exists()) { // proteção para não apagar o arquivo já criado try (FileWriter file = new FileWriter(arquivo)) { System.out.print("Número de Palavras: "); String s = entrada.nextLine(); int numPalavras = Integer.parseInt(s); file.write((byte)numPalavras); file.write('\n'); for (int i = 1;i <= numPalavras;i++) { System.out.print("Palavra: "); byte a = (byte) System.in.read(); while(a != '\n') { file.write(a); a = (byte) System.in.read(); } file.write('\n'); } file.close(); } } else { System.out.println("ERRO: Arquivo já existe"); } } } Exemplo de gravação no arquivo “palavras.dat”: Número de palavras: 5 <enter> Palavra: carambola <enter> Palavra: beringela <enter> Palavra: abacate <enter> Palavra: ervilha <enter> Palavra: damasco <enter> Arquivo gerado: palavras.dat 5 carambola beringela abacate ervilha damasco 141 Observação: Se o programa for executado novamente, dará a seguinte mensagem: “ERRO: Arquivo já existe”, isto protege o arquivo criado anteriormente Programa exemplo: Permite abrir o arquivo de palavras (palavras.dat) e exibe-os na tela. // --------------------------------------------------------------------------------------------------- Programa Principal: ProgCarregaPalavras.java package progcarregapalavras; import java.io.File; import java.io.FileReader; public class ProgCarregaPalavras { public static void main(String[] args) throws Exception { String diretorio = "/Users/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); byte a; if (arquivo.exists()) { try (FileReader file = new FileReader(arquivo)) { int numPalavras = file.read(); file.read(); for (int i = 1;i <= numPalavras;i++) { System.out.print("Palavra: "); a = (byte) file.read(); while(a != '\n') { System.out.printf("%c", a); a = (byte) file.read(); } System.out.println(); } file.close(); } } else { System.out.println("ERRO: Arquivo não existe"); } } } Resultado do Programa: Palavra: carambola Palavra: beringela Palavra: abacate Palavra: ervilha Palavra: damasco Programa exemplo: Permite consultar o arquivo de palavras (palavras.dat). Para tanto é solicitado, ao usuário, o número do registro para ser calculado a posição deste registro no arquivo. Logo após o registro é exibido na tela. // -------------------------------------------------------------------------------------- Programa Principal: ProgCarregaPalavrasUsuario.java package progcarregapalavrasusuario; import java.io.*; import java.util.*; public class ProgCarregaPalavrasUsuario { 142 public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); FileReader file = new FileReader(arquivo); if (arquivo.exists()) { System.out.println("Arquivo: " + arquivo); int numPalavras = file.read(); String temp = buffer.readLine(); // descarta a primeira linha System.out.println("Total de Palavras: " + numPalavras); String [] linha = new String[numPalavras + 1]; for (int i = 0;i < numPalavras;i++) { linha[i] = buffer.readLine(); } buffer.close(); in.close(); file.close(); int pos; do { System.out.print("Posição [1.." + numPalavras + "] ou [0] Sair: "); s = entrada.nextLine(); pos = Integer.parseInt(s); if (pos >= 1 && pos <= numPalavras) { System.out.println("Palavra: " + linha[pos - 1]); } else { if (pos != 0) { System.out.println("ERRO: Posição Inválida"); } } } while (pos != 0); } else { System.out.println("ERRO: Arquivo não existe"); } } } Resultado do Programa: Arquivo: /Users/pluzzardi/palavras.dat Total de Palavras: 5 Posição [1..5] ou [0] Sair: 1 <enter> Palavra: carambola Posição [1..5] ou [0] Sair: 2 <enter> Palavra: beringela Posição [1..5] ou [0] Sair: 3 <enter> Palavra: abacate Posição [1..5] ou [0] Sair: 4 <enter> Palavra: ervilha Posição [1..5] ou [0] Sair: 5 <enter> Palavra: damasco Posição [1..5] ou [0] Sair: 6 <enter> ERRO: Posição Inválida Posição [1..5] ou [0] Sair: 0 <enter> 8.5 Arquivo Texto A seguir é mostrado um programa que lê um arquivo texto contendo: 143 a) Total de Palavras; b) Lista de Palavras (nome de frutas). 144 Arquito Texto: Frutas.txt 15 abacaxi abacate banana pitanga goiaba morango carambola kiwi laranja bergamota tomate uva caqui lima jaca // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgLeitura.java package progleitura; import java.io.*; public class ProgLeitura { public static void main(String[] args) { int linhas = 0; int max = 0; String palavras [], linha; String nomeArquivo = "/Users/pluzzardi/Frutas.txt"; try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); max = Integer.parseInt(leitor.readLine()); palavras = new String[max]; System.out.println("Total de palavras: " + max); int i = 0; while ((linha = leitor.readLine()) != null) { palavras[i] = linha; System.out.println("Palavra: " + palavras[i]); linhas++; i++; } int n = (int) (Math.random() * max); System.out.println("Palavra Sorteada: " + palavras[n]); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo "); } } } Resultado do Programa: Total de palavras: 15 Palavra: abacaxi Palavra: abacate Palavra: banana Palavra: pitanga Palavra: goiaba Palavra: morango Palavra: carambola Palavra: kiwi Palavra: laranja Palavra: bergamota 145 Palavra: tomate Palavra: uva Palavra: caqui Palavra: lima Palavra: jaca Palavra Sorteada: carambola A seguir é mostrado um outro programa que lê um arquivo texto exibindo: (a) número de linhas e (b) número de bytes. // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgBytes.java package progbytes; import java.io.*; import java.util.Scanner; public class ProgBytes { public static void main(String[] args) { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomeArquivo; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readLine()) != null) { bytes = bytes + buffer.length(); linhas++; i++; } System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); } } } Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/NetBeansProjects/Bytes/src/bytes/bytes.java <enter> 37 Linha(s) 987 Byte(s) A seguir é mostrado um outro programa que lê um arquivo texto exibindo: a) Todas as linhas do arquivo texto com seu respectivo número; b) Número de Linhas; c) Número de Bytes. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgListar.java 146 package proglistar; import java.io.*; import java.util.Scanner; public class ProgListar { public static void main(String[] args) { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomeArquivo; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readLine()) != null) { bytes = bytes + buffer.length(); linhas++; System.out.printf("%2d: %s\n", linhas, buffer); i++; } System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); } } } Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/Frutas.txt <enter> 1: 15 2: abacaxi 3: abacate 4: banana 5: pitanga 6: goiaba 7: morango 8: carambola 9: kiwi 10: laranja 11: bergamota 12: tomate 13: uva 14: caqui 15: lima 16: jaca 16 Linha(s) 93 Byte(s) A seguir é mostrado um outro programa que lê um arquivo texto e o número de uma linha e exibe a linha especificada: // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgLinha.java package proglinha; import java.io.*; 147 import java.util.Scanner; public class ProgLinha { public static void main(String[] args) { int linha = 0, numLinha; String s, buffer; Scanner input = new Scanner(System.in); String nomeArquivo; boolean listou = false; System.out.print("Nome do Arquivo: "); nomeArquivo = input.nextLine(); try { FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); System.out.print("Número da Linha: "); s = input.nextLine(); numLinha = Integer.parseInt(s); int i = 0; while ((buffer = leitor.readLine()) != null) { linha++; if (linha == numLinha) { System.out.printf("%2d: %s\n", linha, buffer); listou = true; } i++; } } catch(IOException e){ System.out.println("Erro: Problema com o Arquivo"); } if (!listou) { System.out.println("ERRO: Linha não Encontrada"); } } } Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/Frutas.txt <enter> Número da Linha: 5 <enter> 5: pitanga O seguinte programa mostra como gravar três informações em um arquivo texto (Pessoa.dat): nome, idade e sexo de diversas pessoas. // ----------------------------------------------------------------------------------------------- Programa Principal: ProgWriteDados.java package progwritedados; import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class ProgWriteDados { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); if (!arquivo.exists()) { try (FileWriter file = new FileWriter(arquivo)) { do { System.out.print("Nome: "); String nome = entrada.nextLine(); 148 file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = entrada.nextLine(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = entrada.nextLine(); char sexo = s.charAt(0); file.write(sexo); file.write(":"); System.out.print("Continua [S/N]? "); do { s = entrada.nextLine(); } while (!"SsNn".contains(s)); } while ("S".equalsIgnoreCase(s)); file.close(); } } else { System.out.println("ERRO: Arquivo já existe");} } } Exemplo para testar o programa: Nome: Paulo Roberto <enter> Idade: 51 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Renato Luis <enter> Idade: 49 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Francisco Carlos <enter> Idade: 53 <enter> Sexo [M/F]: m <enter> Continua [S/N]? n <enter> O seguinte programa mostra como recarregar as três informações gravadas em um arquivo texto acima (Pessoa.dat). // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgReadDados.java package progreaddados; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Scanner; public class ProgReadDados { public static void main(String[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { try (FileReader file = new FileReader(arquivo)) { String linha = buffer.readLine(); // lê todos os dados System.out.println("Linha: " + linha); 149 String[] partes = linha.split(":"); int n = partes.length; System.out.println("Partes: " + n); for (int i = 0; i < n; i = i + 3) { System.out.println("Nome: " + partes[i]); System.out.println("Idade: " + Integer.parseInt(partes[i + 1])); System.out.println("Sexo: " + partes[i + 2]); } } buffer.close(); } else { System.out.println("ERRO: Arquivo já existe"); } } } 150 Resultado do Programa: Linha: Paulo Roberto:52:m:Rento Luis:49:m:Francisco Carlos:54:m: Partes: 9 Nome: Paulo Roberto Idade: 52 Sexo: m Nome: Rento Luis Idade: 49 Sexo: m Nome: Francisco Carlos Idade: 54 Sexo: m O programa a seguir mostra como anexar (append) mais informações ao arquivo texto (Pessoa.dat) já existente, sem sobre-escrevê-lo. // ----------------------------------------------------------------------------------------------- Programa Principal: ProgAppendDados.java package progappenddados; import java.io.File; import java.io.IOException; import java.io.*; import java.util.Scanner; public class ProgAppendDados { public static void main(String[] args) throws IOException { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); if (arquivo.exists()) { try (FileWriter file = new FileWriter(arquivo, true)) { // true indica append, ou seja, anexar no fim do arquivo do { // o arquivo não é sobre-escrito, ou seja, ele não é apagado. Os dados antigos System.out.print("Nome: "); // são mantidos e os novos anexados ao fim do arquivo String nome = entrada.nextLine(); file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = entrada.nextLine(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = entrada.nextLine(); char sexo = s.charAt(0); file.write(sexo); file.write(":"); System.out.print("Continua [S/N]? "); do { s = entrada.nextLine(); } while (!"SsNn".contains(s)); } while ("S".equalsIgnoreCase(s)); } } else { System.out.println("ERRO: Arquivo não existe"); } } Exemplo para testar o programa: Nome: Ana Maria <enter> Idade: 56 <enter> Sexo [M/F]: f <enter> Continua [S/N]? s <enter> 151 Nome: Julia Helena <enter> Idade: 55 <enter> Sexo [M/F]: f <enter> Continua [S/N]? n <enter> Resultado do Programa: (ProgReadDados) Linha: Paulo Roberto:52:m:Rento Luis:49:m:Francisco Carlos:54:m:Ana Maria:56:f:Julia Helena:55:f Partes: 15 Nome: Paulo Roberto Idade: 52 Sexo: m Nome: Rento Luis Idade: 49 Sexo: m Nome: Francisco Carlos Idade: 54 Sexo: m Nome: Ana Maria Idade: 56 Sexo: f Nome: Julia Helena Idade: 55 Sexo: f 8.6 Lista de exercícios: Arquivos (Files) 8.6.1 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve imprimir na tela o número de bytes (caracteres) e o número de linhas do arquivo ou ERRO: Arquivo não existe. Entrada: Nome do arquivo texto: lista.java <enter> Saída: (12345) Bytes (44) Linhas ou ERRO: Arquivo não existe 8.6.2 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário consultar o arquivo através da entrada via teclado do número da linha. O programa deve imprimir a linha especificada ou ERRO: Linha não existe (zero para abandonar). Exemplo para testar o programa: Nome do arquivo texto: lista.java <enter> Número de linha: 7 <enter> 7: int i, j, k; Número de linha: 70 <enter> ERRO: Linha não existe Número de linha: 0 <enter> // saída do programa ERRO: Arquivo não existe 8.6.3 Escreva um programa em Java que recebe via teclado o nome de dois arquivos texto (origem e destino). O programa deve copiar o conteúdo do arquivo origem para o arquivo destino. Entrada: Saída: Arquivo origem: lista.java <enter> Arquivo destino: lista.tmp <enter> (20345) Bytes copiados 152 8.6.4 Escreva um programa em Java que recebe via teclado o nome do arquivo texto fonte e o nome do arquivo texto destino. O programa deve converter o arquivo para maiúsculo ou minúsculo (conforme escolha do usuário) gerando o arquivo texto destino. Entrada: Arquivo fonte: lista.java <enter> Arquivo destino: lista.tmp <enter> [+] Maiúsculo ou [-] Minúsculo: + <enter> Saída: (1234) Bytes convertidos 8.6.5 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto e uma palavra. O programa deve imprimir todas as linhas que possuem esta palavra. Entrada: Nome do arquivo texto: palavra.java <enter> Palavra: if <enter> Saída: 23: if (a == b) { 33: if (ch == '\n') { 37: if (compara(linha,palavra)) { 41: if (ch != '\n') { 59: if (linha[i] == palavra[0]) { 65: if (linha[k] != palavra[j]) { 69: if (achei) { ou Erro: Palavra não existe 8.6.6 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário consultar o arquivo através da entrada via teclado do número inicial e número final. O programa deve imprimir desde a linha inicial até a linha final ou ERRO: Linhas não existem. Entrada: Nome do arquivo texto: lista.java <enter> Número inicial: 7 <enter> Número final: 9 <enter> Saída: 7: int i, j, k; 8: char tecla; 9: long bytes = 0; ou Entrada: Número inicial: 70 <enter> Número final: 90 <enter> Saída: ERRO: Linhas não existem 8.6.7 Escreva um programa em Java (grava.java) que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário inserir nomes neste arquivo via teclado. O programa termina quando o usuário digitar <enter> na entrada do nome. Exemplo para testar o programa: Nome do arquivo texto: nomes.txt <enter> Nome: Beatriz <enter> Nome: Eva <enter> Nome: Debora <enter> Nome: Carla <enter> Nome: Fatima <enter> Nome: Ana <enter> Nome: <enter> 153 8.6.8 Escreva um programa em Java (ler.java) que recebe via teclado o nome de um arquivo texto. O programa deve ler e imprimir na tela todos os nomes armazenados no arquivo pelo programa "grava.java". Entrada: Nome do arquivo texto: nomes.txt <enter> Saída: Nome: Beatriz Nome: Eva Nome: Debora Nome: Carla Nome: Fatima Nome: Ana 8.6.9 Escreva um programa em Java (sort.java) que recebe via teclado o nome de um arquivo texto origem e um destino. O programa deve ler, ordenar e gravar novamente os nomes no arquivo destino. Exemplo para testar o programa: Nome do arquivo texto origem: nomes.txt <enter> Nome do arquivo texto destino: nomes.srt <enter> Ok, arquivo ordenado e copiado Observação: Utilize o programa anterior (ler.java) para ver os nomes ordenados. 8.6.10 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário inserir nome, idade e sexo ([M]asculino ou [F]eminino) neste arquivo via teclado. O programa termina quando o usuário digitar <enter> na entrada do nome. Exemplo para testar o programa: Nome do arquivo texto: dados.txt <enter> Nome: Paulo Roberto <enter> Idade: 41 <enter> Sexo [M/F]: m <enter> Nome: Renato Luis <enter> Idade: 38 <enter> Sexo [M/F]: m <enter> Nome: Ana Maria <enter> Idade: 44 <enter> Sexo [M/F]: f <enter> Nome: <enter> 8.6.11 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve ler e imprimir na tela todos os dados (nome, idade e sexo) armazenados no arquivo pelo programa "8.6.10" (veja exemplo abaixo). Entrada: Nome do arquivo texto: dados.txt <enter> Saída: Nome: Paulo Roberto Idade: 41 Sexo: MASCULINO Nome: Renato Luis Idade: 38 Sexo: MASCULINO Nome: Ana Maria Idade: 44 Sexo: FEMININO 8.6.12 Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve verificar a quantidade de homens e a quantidade de mulheres no aquivo criado pelo programa "14.6.10". Entrada: Nome do arquivo texto: dados.txt <enter> 154 Saída: (2) Homens (1) Mulheres 8.7 Acesso randômico em arquivos texto É possível acessar um arquivo texto de forma randômica (aleatória), ou seja, não puramente sequencial como é o padrão. Desta forma, pode-se acessar qualquer linha de um arquivo texto. // ---------------------------------------------------------------------------------------------- Programa Principal: ProgRadomTexto.java package prograndomtexto; import java.io.RandomAccessFile; import java.io.IOException; import java.util.Scanner; public class ProgRandomTexto { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { int nl; RandomAccessFile file = new RandomAccessFile(nomeArquivo, "r"); do { boolean encontrouLinha = false; System.out.print("Linha: "); String s = input.nextLine(); nl = Integer.parseInt(s); int linhas = 0; while ((linha = file.readLine()) != null) { linhas++; if (nl == linhas) { System.out.println(nl + ": " + linha); encontrouLinha = true; } } if (!encontrouLinha) { System.out.println("ERRO: Linha não existe"); } file.seek(0); // volta para a primeira linha } while (nl != 0); file.close(); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } } Exemplo para testar o programa: Nome do Arquivo Texto: /Users/pluzzardi/Frutas.txt <enter> Linha: 3 <enter> 3: abacate Linha: 5 <enter> 5: pitanga Linha: 99 <enter> ERRO: Linha não existe Linha: 0 <enter> 155 ERRO: Linha não existe 8.8 Arquivo binário de objetos em Java Em Java é possível gravar e carregar dados em arquivos binários que nada mais são que são filas de bytes. Abaixo são vistos dois programas: (a) BinaryWrite grava dados (nome idade e sexo) que são armazenados em um ArrayList e (b) programa BinaryRead recupera os dados (como uma lista de dados) gravados no arquivo binário gerado pelo programa BinaryWrite. // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgBinaryWrite.java package progbinarywrite; import java.io.File; import java.io.ObjectOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; public class ProgBinaryWrite { public static void main(String[] args) throws IOException { Scanner input = new Scanner(System.in); String s; ArrayList pessoa = new ArrayList(); System.out.print("Nome do Arquivo Binário: "); String nomeArquivo = input.nextLine(); try { File file = new File(nomeArquivo); try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file))) { do { System.out.print("Nome: "); String nome = input.nextLine(); System.out.print("Idade: "); s = input.nextLine(); int idade = Integer.parseInt(s); System.out.print("Sexo [M/F]: "); s = input.nextLine(); char sexo = s.charAt(0); pessoa.add(nome); pessoa.add(idade); pessoa.add(sexo); do { System.out.print("Continua [S/N]? "); s = input.nextLine(); } while (!"SsNn".contains(s)); } while (!"Nn".contains(s)); output.writeObject(pessoa); // grava ArrayList } } catch (IOException | NumberFormatException e) { System.out.println(e.toString()); } } } Exemplo para testar o programa: Nome do Arquivo Binário: /Users/pluzzardi/pessoa.dat <enter> Nome: Paulo <enter> Idade: 51 <enter> 156 Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Renato <enter> Idade: 49 <enter> Sexo [M/F]: M <enter> Continua [S/N]? s <enter> Nome: Francisco <enter> Idade: 53 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Ana <enter> Idade: 55 <enter> Sexo [M/F]: f <enter> Continua [S/N]? s <enter> Nome: Julia <enter> Idade: 54 <enter> Sexo [M/F]: F <enter> Continua [S/N]? N <enter> // ----------------------------------------------------------------------------------------------- Programa Principal: ProgBinaryRead.java package progbinaryread; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.util.Scanner; public class ProgBinaryRead { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomeArquivo = entrada.nextLine(); try { File file = new File(nomeArquivo); ObjectInputStream input = new ObjectInputStream(new FileInputStream(file)); Object pessoa = input.readObject(); System.out.println(pessoa.toString()); } catch (IOException | ClassNotFoundException e) { System.out.println(e.toString()); } } } Entrada: Nome do Arquivo Binário: /Users/pluzzardi/pessoa.dat <enter> Saída: [Paulo, 51, m, Renato, 49, M, Francisco, 53, m, Ana, 55, f, Julia, 54, F] 8.9 Leitura e gravação de objetos (registro) em Arquivos Em Java é possível ler e gravar dados organizados em registros. Um registro é um conjuntos de campos, onde campos são qualquer tipo em Java. public class Registro { Object nome; Object idade; Object sexo; } nome idade sexo 157 8.9.1 Gravação de objetos em um arquivo binário de objetos O programa abaixo permite gravar em um arquivo binário de objetos as seguintes informações: nome, idade e sexo. file.addFile("Paulo Roberto", 50, 'm'); file.addFile("Adriane Maria", 42, 'f'); file.addFile("Paola", 13, 'f'); // -------------------------------------------------------------------------------------------------------------------------- Classe: Registro.java package progwritefileregistro; public class Registro { Object nome; Object idade; Object sexo; Registro(String nome, int idade, char sexo) { this.nome = nome; this.idade = idade; this.sexo = sexo; } } // ------------------------------------------------------------------------------------------------------- Programa Principal: FileObjeto.java package progwritefileregistro; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; public class FileObjeto { // ------------------------------ atributos da classe String nomeFile; private ObjectOutputStream fileOut; FileObjeto(String nomeArquivo) { nomeFile = nomeArquivo; try { fileOut = new ObjectOutputStream(new FileOutputStream(nomeFile)); System.out.println("Ok, Arquivo criado: " + nomeFile); } catch (IOException ioException) { System.out.println("ERRO Fatal: Problema na criação do Arquivo: " + nomeFile); } } // ------------------------------- addFile public void addFile(String nome, int idade, char sexo) throws IOException, ClassNotFoundException { Registro registro = new Registro(nome, idade, sexo); fileOut.writeObject(registro.nome); fileOut.writeObject(registro.idade); fileOut.writeObject(registro.sexo); } // ------------------------------- closeFile public void closeFile() { try { if (fileOut != null) { 158 fileOut.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossível fechar o arquivo: " + nomeFile); System.exit(1); } } } // --------------------------------------------------------------------------------------- Programa Principal: ProgWriteFileRegistro.java package progwritefileregistro; import java.io.IOException; import java.util.Scanner; public class ProgWriteFileRegistro { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.addFile("Paulo Roberto", 50, 'm'); file.addFile("Adriane Maria", 42, 'f'); file.addFile("Paola", 13, 'f'); file.closeFile(); } } Entrada: Nome do Arquivo Binário: /Users/pluzzardi/Objeto.dat <enter> Saída: Ok, Arquivo criado: /Users/pluzzardi/Objeto.dat Ok, Arquivo fechado: /Users/pluzzardi/Objeto.dat Observação: Por questões didáticas, simplificação, não foi testado se o arquivo binário existe, ou seja, se ele existir, será sobre-escrito. Solução 2: Nesta solução o usuário digita os nomes, idades e sexo das pessoas. // --------------------------------------------------------------------------------------------------------------------------- Classe: Registro.java package progwritefileregistro2; public class Registro { Object nome; Object idade; Object sexo; Registro(String nome, int idade, char sexo) { this.nome = nome; this.idade = idade; this.sexo = sexo; } } // -------------------------------------------------------------------------------------------------------- Programa Principal: FileObjeto.java package progwritefileregistro2; import java.io.FileOutputStream; import java.io.IOException; 159 import java.io.ObjectOutputStream; public class FileObjeto { // ------------------------------ atributos da classe String nomeFile; private ObjectOutputStream fileOut; FileObjeto(String nomeArquivo) { nomeFile = nomeArquivo; try { fileOut = new ObjectOutputStream(new FileOutputStream(nomeFile)); System.out.println("Ok, Arquivo criado: " + nomeFile); } catch (IOException ioException) { System.out.println("ERRO Fatal: Problema na criação do Arquivo: " + nomeFile); } } // ----------------------------------------------------------------------------------------------------------------------------- addFile public void addFile(Registro registro) throws IOException, ClassNotFoundException { fileOut.writeObject(registro.nome); fileOut.writeObject(registro.idade); fileOut.writeObject(registro.sexo); } // -------------------------------------- closeFile public void closeFile() { try { if (fileOut != null) { fileOut.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossível fechar o arquivo: " + nomeFile); System.exit(1); } } } // ---------------------------------------------------------------------------------------- Programa Principal: ProgWriteFileRegistro2.java package progwritefileregistro2; import java.io.IOException; import java.util.Scanner; public class ProgWriteFileRegistro2 { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); char ch; System.out.print("Nome do Arquivo: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); do { System.out.print("Nome: "); String nome = input.nextLine(); System.out.print("Idade: "); String s = input.nextLine(); int idade = Integer.parseInt(s); System.out.print("sexo [M]asculino ou [F]eminino: "); s = input.nextLine(); char sexo = s.charAt(0); Registro registro = new Registro(nome, idade, sexo); file.addFile(registro); System.out.print("Continua [S/N]? "); do { 160 s = input.nextLine(); ch = s.charAt(0); } while (!strChr("SsNn", ch)); } while (strChr("Ss", ch)); file.closeFile(); } // --------------------------------------------------------- strChr static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } } Exemplo para testar o programa: Nome do Arquivo: /Users/pluzzardi/luz.dat <enter> Ok, Arquivo criado: /Users/pluzzardi/luz.dat Nome: Paulo Roberto <enter> Idade: 51 <enter> sexo [M]asculino ou [F]eminino: m <enter> Continua [S/N]? s <enter> Nome: Renato Luis <enter> Idade: 49 <enter> sexo [M]asculino ou [F]eminino: m <enter> Continua [S/N]? s <enter> Nome: Francisco Carlos <enter> Idade: 53 <enter> sexo [M]asculino ou [F]eminino: m <enter> Continua [S/N]? n <enter> Ok, Arquivo fechado: /Users/pluzzardi/luz.dat 8.9.2 Leitura objetos em um arquivo binário de objetos O programa abaixo permite carregar (ler) de um arquivo binário de objetos com as seguintes informações: nome, idade e sexo. // --------------------------------------------------------------------------------------------------------------------------------------- Classe: Registro.java package progreadfileregistro; public class Registro { Object nome; Object idade; Object sexo; } // ---------------------------------------------------------------------------------------------------------------- Programa Principal: FileObjeto.java package progreadfileregistro; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.EOFException; public class FileObjeto { // ---------------------------------- atributos da classe String nomeFile; 161 private ObjectInputStream fileIn; // ----------------------------------------------- construtor FileObjeto(String nomeArquivo) { nomeFile = nomeArquivo; try { fileIn = new ObjectInputStream(new FileInputStream(nomeFile)); System.out.println("Ok, Arquivo Aberto: " + nomeFile); } catch (IOException ioException) { System.out.println("ERRO Fatal: Problema na Abertura do Arquivo: " + nomeFile); System.exit(1); } } // ----------------------------------------------------------------------------------------------------- getFile public void getFile() throws IOException, ClassNotFoundException { Registro registro = new Registro(); System.out.println("Nome Idade Sexo"); try { while (true) { registro.nome = fileIn.readObject(); registro.idade = fileIn.readObject(); registro.sexo = fileIn.readObject(); System.out.printf("%-20s %2d %c\n", registro.nome, registro.idade, registro.sexo); } } catch (EOFException endOfFileException) { } } // ------------------------------------------- closeFile public void closeFile() { try { if (fileIn != null) { fileIn.close(); System.out.println("Ok, Arquivo fechado: " + nomeFile); } } catch (IOException ioException) { System.out.println("ERRO Fatal: Impossível fechar o arquivo: " + nomeFile); System.exit(1); } } } // -------------------------------------------------------------------------------------- Programa Principal: ProgReadFileRegistro.java package progreadfileregistro; import java.io.IOException; import java.util.Scanner; public class ProgReadFileRegistro { public static void main(String[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomeArquivo = input.nextLine(); FileObjeto file = new FileObjeto(nomeArquivo); file.getFile(); file.closeFile(); } } Entrada: Nome do Arquivo Binário: /Users/pluzzardi/Objeto.dat <enter> Saída: Ok, Arquivo Aberto: /Users/pluzzardi/Objeto.dat 162 Nome Idade Sexo Paulo Roberto 50 m Adriane Maria 42 f Paola 13 f Ok, Arquivo fechado: /Users/pluzzardi/Objeto.dat ou Entrada: Nome do Arquivo: /Users/pluzzardi/luz.dat <enter> Saída: Ok, Arquivo Aberto: /Users/pluzzardi/luz.dat Nome Idade Sexo Paulo Roberto 51 m Renato Luis 49 m Francisco Carlos 53 m Ok, Arquivo fechado: /Users/pluzzardi/luz.dat 163 9. Noções de desenvolvimento de aplicações em camadas (MVC) 9.1 Conceitos Model View Controller (MVC – Modelo Visão Controlador) é um modelo de arquitetura de programa que divide a representação da informação e da interação. O model (modelo) contém os dados da aplicação, as regras de negócios, a lógica e os métodos. Uma view (visão) pode ser qualquer saída ou impressão da representação dos dados. Pode-se possuir várias visões da mesma informação. O controller (controlador) faz a mediação da entrada, convertendo-a em comandos para o modelo ou visão. As vantagens do MVC são resusabilidade de código e separação de conceitos. Resumindo, as partes presentes no MVC tem as seguintes funções: Controller enxerga a view e reconhece o model. Recebe requisições do usuário da view e envia para o model executar as requisições. Model recebe as requisições e as executa, atualizando os dados da aplicação. View analisa o model e espera os dados serem atualiza-dos, mostrando os dados atualizados. Vantagens do modelo Model View Controller: 1. É fácil manter, testar e atualizar. 2. É simples incluir novos dados, apenas pela inclusão de seus visualizadores e controles. 3. Torna a aplicação escalável. 4. Desenvolvimento paralelo do model, view e controller por serem independentes. Desvantagens do modelo Model View Controller: 1. Necessita quantidade maior de tempo para analisar e modelar o sistema. 2. Necessita pessoas especializadas. 3. Não recomendável para aplicações pequenas. 9.2 Primeiro exemplo da utilização do MVC (ProgMVCPessoa) A seguir é visto e descrito a utilização do MVC em Java (Figura 12). O programa ProgMVCPessoa trabalha com as seguintes informações de uma pessoa (nome, idade e sexo). 164 Figura 12: Exemplo de MVC // ------------------------------------------------------------------------------------------------------------------------------------------------- Pacote: entity // -------------------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package entity; public final class Pessoa { // --------------------------------- atributos da classe private String nome; private int idade; private char sexo; // ---------------------------------- construtores da classe public Pessoa() { setNome("xxxxxxxxxx"); setIdade(-99); setSexo('x'); } public Pessoa(String nome, int idade, char sexo) { setNome(nome); 165 setIdade(idade); setSexo(sexo); } // ----------------------------------------------------- métodos públicos da classe public void setNome(String nome) { this.nome = nome; } public void setIdade(int idade) { this.idade = idade >= 0 && idade <= 110 ? idade : -99; } public void setSexo(char sexo) { if (strChr("MmFf", sexo)) { this.sexo = sexo; } else { this.sexo = 'x'; } } public String getNome() { return (nome); } public int getIdade() { return (idade); } public char getSexo() { return (sexo); } // ----------------------------------------------------------- métodos estáticos da classe static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 166 // --------------------------------------------------------------------------------------------------------------------------------------- Pacote: pessoaView // ---------------------------------------------------------------------------------------------------------------------------------- Classe: PessoaView.java package pessoaView; import entity.Pessoa; import service.PessoaService; public final class PessoaView { // -------------------------------------------- atributos da classe PessoaService pessoaService; // ------------------------------- construtor da classe PessoaView() { pessoaService = new PessoaService("Paulo Roberto", 152, 't'); exibeView(pessoaService); PessoaService pessoaService = new PessoaService(); pessoaService.alteraPessoa("Renato Luis", 49, 'm'); exibeView(pessoaService); } // --------------------------------------------------------------- métodos públicos da classe public void exibeView(Pessoa pessoa) { System.out.println("Nome: " + pessoa.getNome()); if (pessoa.getIdade() != -99) { System.out.println("Idade: " + pessoa.getIdade()); } else { System.out.println("ERRO: Idade Inválida"); } if (pessoa.getSexo() != 'x') { System.out.println("Sexo: " + pessoa.getSexo()); } else { System.out.println("ERRO: Sexo Inválido"); } } public void exibeView(PessoaService pessoa) { System.out.println("Nome: " + pessoa.getPessoa().getNome()); if (pessoa.getPessoa().getIdade() != -99) { System.out.println("Idade: " + pessoa.getPessoa().getIdade()); } else { System.out.println("ERRO: Idade Inválida"); } if (pessoa.getPessoa().getSexo() != 'x') { System.out.println("Sexo: " + pessoa.getPessoa().getSexo()); } else { System.out.println("ERRO: Sexo Inválido"); } } } // ------------------------------------------------------------------------------------------------------------------- Programa Principal: Principal.java package pessoaView; public class Principal { public static void main(String[] args) { new PessoaView(); } } // -------------------------------------------------------------------------------------------------------------------------------------------- Pacote: service // -------------------------------------------------------------------------------------------------------------------------- Classe: PessoaService.java 167 package service; import entity.Pessoa; public class PessoaService { // --------------------------------- atributos da classe private Pessoa pessoa; // ------------------------------------------ construtor da classe public PessoaService() { pessoa = new Pessoa(); } public PessoaService(String nome, int idade, char sexo) { pessoa = new Pessoa(); alteraPessoa(nome, idade, sexo); } // --------------------------------------------------------------------------------------------- métodos públicos da classe public void alteraPessoa(String nome, int idade, char sexo) { pessoa.setNome(nome); pessoa.setIdade(idade); pessoa.setSexo(sexo); } public Pessoa getPessoa() { return(pessoa); } } Resultado do Programa: Nome: Paulo Roberto ERRO: Idade Inválida ERRO: Sexo Inválido Nome: Renato Luis Idade: 49 Sexo: m 9.3 Segundo exemplo da utilização do MVC (ProgMVCPessoa2) A seguir é visto e descrito a utilização do MVC em Java (Figura 13). O programa ProgMVCPessoa trabalha com as seguintes informações de uma pessoa (nome, idade e sexo) e permite ao usuário digitar estas informações via teclado. 168 Figura 13: Exemplo de MVC // --------------------------------------------------------------------------------------------------------------------------------------------- Pacote: entity // ---------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package entity; public final class Pessoa { // -------------------------------- atributos da classe private String nome; private int idade; private char sexo; // --------------------------------- construtores da classe public Pessoa() { setNome("xxxxxxxxxx"); setIdade(-99); setSexo('x'); } public Pessoa(String nome, int idade, char sexo) { setNome(nome); setIdade(idade); setSexo(sexo); } // ---------------------------------------------------------- métodos públicos da classe public void setNome(String nome) { this.nome = nome; } public void setIdade(int idade) { this.idade = idade >= 0 && idade <= 110 ? idade : -99; 169 } public void setSexo(char sexo) { if (strChr("MmFf", sexo)) { this.sexo = sexo; } else { this.sexo = 'x'; } } public String getNome() { return (nome); } public int getIdade() { return (idade); } public char getSexo() { return (sexo); } // ----------------------------------------------------------------- métodos públicos da classe static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } // ----------------------------------------------------------------------------------------------------------------------------------------- Pacote: pessoaView // ------------------------------------------------------------------------------------------------------------ Classe: PessoaView.java package pessoaView; import entity.Pessoa; import service.PessoaService; import static util.Utilidade.*; public final class PessoaView { // ------------------------------------------------ atributos da classe PessoaService pessoaService; // ------------------------------------------------- construtor da classe PessoaView() { String nome = lerString("Digite seu Nome: "); int idade = lerInteiro("Digite sua Idade: "); char sexo = lerChar("Seu Sexo [M]asculino ou [F]eminino: "); pessoaService = new PessoaService(nome, idade, sexo); exibeView(pessoaService); PessoaService pessoaService = new PessoaService(); nome = lerString("Digite seu Nome: "); idade = lerInteiro("Digite sua Idade: "); sexo = lerChar("Sexo [M]asculino ou [F]eminino: "); pessoaService.alteraPessoa(nome, idade, sexo); exibeView(pessoaService); } // ---------------------------------------------------------------- métodos públicos da classe public void exibeView(Pessoa pessoa) { System.out.println("Nome: " + pessoa.getNome()); if (pessoa.getIdade() != -99) { System.out.println("Idade: " + pessoa.getIdade()); 170 } else { System.out.println("ERRO: Idade Inválida"); } if (pessoa.getSexo() != 'x') { System.out.println("Sexo: " + pessoa.getSexo()); } else { System.out.println("ERRO: Sexo Inválido"); } } public void exibeView(PessoaService pessoa) { System.out.println("Nome: " + pessoa.getPessoa().getNome()); if (pessoa.getPessoa().getIdade() != -99) { System.out.println("Idade: " + pessoa.getPessoa().getIdade()); } else { System.out.println("ERRO: Idade Inválida"); } if (pessoa.getPessoa().getSexo() != 'x') { System.out.println("Sexo: " + pessoa.getPessoa().getSexo()); } else { System.out.println("ERRO: Sexo Inválido"); } } } // -------------------------------------------------------------------------------------------------------------------- Programa Principal: Principal.java package pessoaView; public class Principal { public static void main(String[] args) { new PessoaView(); } } // -------------------------------------------------------------------------------------------------------------------------------------------- Pacote: service // ----------------------------------------------------------------------------------------------------------------------------- Classe: PessoaService.java package service; import entity.Pessoa; public class PessoaService { // -------------------------------------- atributos da classe private Pessoa pessoa; // -------------------------------------- construtor da classe public PessoaService() { pessoa = new Pessoa(); } public PessoaService(String nome, int idade, char sexo) { pessoa = new Pessoa(); alteraPessoa(nome, idade, sexo); } // ------------------------------------------------------------------------------------------- métodos públicos da classe public void alteraPessoa(String nome, int idade, char sexo) { pessoa.setNome(nome); pessoa.setIdade(idade); pessoa.setSexo(sexo); } public Pessoa getPessoa() { return(pessoa); } 171 } // ----------------------------------------------------------------------------------------------------------------------------------------------- Pacote: util // ------------------------------------------------------------------------------------------------------------- Classe: Utilidade.java package util; import java.util.Scanner; public class Utilidade { public static String lerString(String mensagem) { Scanner input = new Scanner(System.in); System.out.print(mensagem); String s = input.nextLine(); return(s); } public static int lerInteiro(String mensagem) { Scanner input = new Scanner(System.in); System.out.print(mensagem); String s = input.nextLine(); int inteiro = Integer.parseInt(s); return(inteiro); } public static char lerChar(String mensagem) { Scanner input = new Scanner(System.in); System.out.print(mensagem); String s = input.nextLine(); char ch = s.charAt(0); return(ch); } } 172 Entrada: Digite seu Nome: Paulo Roberto <enter> Digite sua Idade: 52 <enter> Seu Sexo [M]asculino ou [F]eminino: m <enter> Saída: Nome: Paulo Roberto Idade: 52 Sexo: m ou Entrada: Digite seu Nome: Adriane Maria <enter> Digite sua Idade: 44 <enter> Sexo [M]asculino ou [F]eminino: f <enter> Saída: Nome: Adriane Maria Idade: 44 Sexo: f 173 10. Conceitos gerais 10.1 Como é calculado o hashcode no Java A seguir é visto um pequeno programa que mostra o cálculo do hashcode de uma string (String) e/ou de um objeto (Object) em Java. // ----------------------------------------------------------------------------------------------- Programa Principal: ProgHash.java package proghash; public class ProgHash { public static void main(String[] args) { String s = "abcdef"; Object objeto = "abcdef"; int n = s.length(); System.out.println("HashCode: " + s.hashCode()); int hash = 0; for (int i = 0;i < s.length();i++) { hash = 31 * hash + s.charAt(i); } System.out.println("Hash calculado: " + hash); System.out.println("HashCode objeto: " + objeto.hashCode()); } } Resultado do Programa: HashCode: -1424385949 Hash calculado: -1424385949 HashCode objeto: -1424385949 Observação: Note que o resultado deu negativo pois extrapolou o máximo dos inteiros positivos (int). Veja na Tabela 5, abaixo, a faixa de valores ddos números inteiros. Tabela 5: Tipos de dados do Java Tipo boolean char byte short int long float double Bytes 1 2 1 2 4 8 4 8 Bits 8 16 8 16 32 64 32 64 Faixa de valores true ou false 0 à 65.535 -128 à 127 -32.768 à 32.767 -2.147.483.648 à 2.147.483.647 -2E63 à 2E63 1.40239846e-46 à 3.40282347e+38 4.94065645841246544e-324 à 1.7976931348623157e+308 174 11. Lista Encadeada Simples em Java 11.1 Lista Encadeada de Inteiros A implementação de uma Lista Encadeada permite alocacar dinamicamente elementos na memória RAM, ou seja, a lista linear de elementos cresce com a execução do programa enquanto houver memória livre. Operações como inserção e remoção são mais simples. Este tipo de estrutura se chama Lista Encadeada Simples ou Lista Encadeada (Figura 14). Figura 14: Lista Encadeada Simples Funcionamento: Nas listas encadeadas simples ou duplamente encadeadas, aonde os elementos são alocados dinamicamente, elas crescem com a necessidade do usuário. Por outro lado, o programador não precisa estipular um tamanho fixo para elas, pois elas podem crescer enquanto houver memória livre, ou seja, os elementos alocados e armazenados podem estar em qualquer posição da área de dados da memória RAM (Random Access Memory) [Figura 15]. Desta forma, os elementos precisam estar conectados por uma ligação entre os nodos da lista, esta ligação se chama “elo”. Em Java este “elo” é uma referência. Além disso, é necessário armazenar, pelo menos, a referência do primeiro elemento da lista, para se ter acesso aos demais elementos da lista. E para facilitar, pode-se ainda armazenar o número de elementos da lista (e o último), pois para obter esta informação, seria necessário percorrer toda a lista contando os elementos. Esta operação é muito dispendiosa se a lista for muito grande. public class Nodo { public int info; public Nodo elo; } // info: informação que será armazenada na memória RAM // guarda a referência do próximo elemento Observação: Note que esta lista encadeada simples (acima) funcionará como uma pilha, pois ela cresce para a esquerda, ou seja, toda inserção e remoção é realizada apenas num extremo (lado esquerdo). 175 Figura 15: Alocação de elementos na Memória RAM A Figura 15 acima, mostra a diferença entre alocação estática de memória e a alocação dinâmica de memória. Note que na estática (lado esquerdo) há contiguidade física, ou seja, os elementos estão um ao lado do outro, por causa disto é possível “indexar” cada elemento de um vetor, ou seja, x[0], x[1], … x[n]. Note que na dinâmica (lado direito) é necessário (obrigatório) armazenar a referência do primeiro elemento e o primeiro elemento necessita ter um “elo” para o segundo e assim sucessivamente, até que o último elemento não aponta para “nenhum” elemento (referência do último é null). Note que o vetor “x” alocado estaticamente é: short []x = {10, 20, 30, 40, 50, 60, 70, 80}; Observação: Cada elemento do tipo short ocupa 2 bytes na memória RAM Note que a lista encadeada simples é: 10 20 30 40 50 // onde 10 é o primeiro // 50 é o último elemento Problema proposto: Escrever um programa em Java que permite inserir, excluir, consultar dados em uma lista encadeada simples. Programa exemplo: Demonstra a “inclusão”, “exclusão” e “consulta” de números inteiros em uma lista encadeada simples utilizando as classes: Nodo e ListaSimples escritas pelo programador. 176 // --------------------------------------------------------------------------------------------------------------------------------- Classe: Nodo.java package progsimples; public class Nodo { public int info; public Nodo elo; } // --------------------------------------------------------------------------------------------------------------------------------- Classe: ListaSimples.java package progsimples; public class ListaSimples { // ------------------------------------ atributos da classe private int n; private Nodo primeiro; // ------------------------------------ construtor ListaSimples() { primeiro = null; n = 0; } // ----------------------------------------------------------- métodos públicos da classe // ----------------------------------------------------------- incluir public void incluir(int valor) { Nodo ref = new Nodo(); ref.info = valor; if (n != 0) { ref.elo = primeiro; } n++; primeiro = ref; } // ----------------------------------------------------------- excluir public int excluir() { if (n == 0) { return (-999); } else { Nodo ref = primeiro; int valor = ref.info; primeiro = ref.elo; n--; if (n == 0) { primeiro = null; } return (valor); } } // ----------------------------------------------------------- pesquisar public int pesquisar(int valor) { if (n != 0) { Nodo ref = primeiro; int posicao = 1; while (ref != null) { if (ref.info == valor) { return (posicao); } ref = ref.elo; posicao++; } } else { System.out.println("ERRO: Lista Vazia"); } return (-1); 177 } // ----------------------------------------------------------- exibir public void exibir() { Nodo ref = primeiro; System.out.print("Lista Encadeada Simples: ["); if (n == 0) { System.out.println("Vazia]"); } else { while (ref != null) { System.out.print(ref.info + " "); ref = ref.elo; } System.out.println("\b]"); } } // ----------------------------------------------------------- exibirDescritor public void exibeDescritor() { System.out.println("Descritor: | " + primeiro + " | " + n + " |"); } // ----------------------------------------------------------- removeAll public void removeAll() { primeiro = null; n = 0; System.gc(); } // ----------------------------------------------------------- consultar public int consultar() { if (n == 0) { return (-999); } else { Nodo ref = primeiro; int valor = ref.info; return (valor); } } // ---------------------- métodos privados da classe // ---------------------- métodos estáticos da classe } // ------------------------------------------------------------------------------------------------------------------------------- Classe: ProgSimples.java package progsimples; import java.util.Scanner; public class ProgSimples { public static void main(String[] args) { ListaSimples simples = new ListaSimples(); Scanner input = new Scanner(System.in); char op; int valor, posicao; do { simples.exibeDescritor(); simples.exibir(); do { System.out.print("[I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: "); String s = input.nextLine(); op = s.charAt(0); } while (!strChr("IiEeCcPpRrFf", op)); if (strChr("Ff", op)) { System.exit(0); 178 } switch (op) { case 'I': case 'i': System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); simples.incluir(valor); break; case 'E': case 'e': valor = simples.excluir(); if (valor != -999) { System.out.println("Valor Excluído à Esquerda: " + valor); } else { System.out.println("ERRO: Lista vazia à Esquerda"); } break; case 'P': case 'p': System.out.print("Valor à Pesquisar: "); s = input.nextLine(); int valorPesquisar = Integer.parseInt(s); posicao = simples.pesquisar(valorPesquisar); if (posicao != -1) { System.out.println("Posição do Valor pesquisado: " + posicao); } else { System.out.println("ERRO: Valor não encontrado"); } break; case 'R': case 'r': simples.removeAll(); break; case 'C': case 'c': valor = simples.consultar(); if (valor != -999) { System.out.println("Valor Consultado à Esquerda: " + valor); } else { System.out.println("ERRO: Lista vazia à Esquerda"); } break; } } while (!strChr("Ff", op)); } public static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } Exemplo para testar o programa: Descritor: | null | 0 | Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 10 <enter> Descritor: | progsimples.Nodo@77eec5fe | 1 | Lista Encadeada Simples: [10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> 179 Valor: 20 <enter> Descritor: | progsimples.Nodo@5d08e435 | 2 | Lista Encadeada Simples: [20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 30 <enter> Descritor: | progsimples.Nodo@72be834a | 3 | Lista Encadeada Simples: [30 20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 40 <enter> Descritor: | progsimples.Nodo@399daa20 | 4 | Lista Encadeada Simples: [40 30 20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 40 Descritor: | progsimples.Nodo@72be834a | 3 | Lista Encadeada Simples: [30 20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: p <enter> Valor à Pesquisar: 20 <enter> Posição do Valor pesquisado: 2 Descritor: | progsimples.Nodo@72be834a | 3 | Lista Encadeada Simples: [30 20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> Valor Consultado à Esquerda: 30 Descritor: | progsimples.Nodo@72be834a | 3 | Lista Encadeada Simples: [30 20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 30 Descritor: | progsimples.Nodo@5d08e435 | 2 | Lista Encadeada Simples: [20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 20 Descritor: | progsimples.Nodo@77eec5fe | 1 | Lista Encadeada Simples: [10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 10 Descritor: | null | 0 | Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: f <enter> 11.2 Lista Encadeada Genérica (String, Integer ou Double) A seguir, a Lista Simples Genérica permite armazenar elementos dos seguintes tipos de dados: String, Integer, Double ou Character. Sintaxe: ListaSimplesGenerica <String> simples = new ListaSimplesGenerica<>(); // --------------------------------------------------------------------------------------------------------------------------------- Classe: Nodo.java package progsimples; public class Nodo<E> { E element; Nodo<E> elo; } // ------------------------------------------------------------------------------------------------------------- Classe: ListaSimplesGenerica.java package progsimples; public class ListaSimplesGenerica <E>{ // ---------------------- atributos da classe private int n; private Nodo primeiro; // ---------------------- construtor 180 ListaSimplesGenerica() { primeiro = null; n = 0; } // ----------------------------------------------------------- métodos públicos da classe // ----------------------------------------------------------- incluir public void incluir(Object valor) { Nodo ref = new Nodo(); ref.element = valor; if (n != 0) { ref.elo = primeiro; } n++; primeiro = ref; } // ----------------------------------------------------------- excluir public Object excluir() { if (n == 0) { return (-999); } else { Nodo ref = primeiro; Object valor = ref.element; primeiro = ref.elo; n--; if (n == 0) { primeiro = null; } return (valor); } } // ----------------------------------------------------------- pesquisar public int pesquisar(Object valor) { if (n != 0) { Nodo ref = primeiro; int posicao = 1; while (ref != null) { if (ref.element.equals(valor)) { return (posicao); } ref = ref.elo; posicao++; } } else { System.out.println("ERRO: Lista Vazia"); } return (-1); } // ----------------------------------------------------------- exibir public void exibir() { Nodo ref = primeiro; System.out.print("Lista Encadeada Simples: ["); if (n == 0) { System.out.println("Vazia]"); } else { while (ref != null) { System.out.print(ref.element + " "); ref = ref.elo; } System.out.println("\b]"); } } // ----------------------------------------------------------- exibirDescritor public void exibeDescritor() { 181 System.out.println("Descritor: | " + primeiro + " | " + n + " |"); } // ----------------------------------------------------------- removeAll public void removeAll() { primeiro = null; n = 0; System.gc(); } // ----------------------------------------------------------- consultar public Object consultar() { if (n == 0) { return (-999); } else { Nodo ref = primeiro; Object valor = ref.element; return (valor); } } // ---------------------- métodos privados da classe // ---------------------- métodos estáticos da classe } // ----------------------------------------------------------------------------------------------------------- Classe: ProgListaSimplesGenerica.java package progsimples; import java.util.Scanner; public class ProgSimplesGenerica { public static void main(String[] args) { ListaSimplesGenerica<String> simples = new ListaSimplesGenerica<>(); // troque String por Integer ou Double e teste novamente Scanner input = new Scanner(System.in); char op; int posicao; Object valor; do { simples.exibeDescritor(); simples.exibir(); do { System.out.print("[I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: "); String s = input.nextLine(); op = s.charAt(0); } while (!strChr("IiEeCcPpRrFf", op)); if (strChr("Ff", op)) { System.exit(0); } switch (op) { case 'I': case 'i': System.out.print("Valor: "); String s = input.nextLine(); simples.incluir(s); break; case 'E': case 'e': valor = simples.excluir(); if (valor.hashCode() != -999) { System.out.println("Valor Excluído à Esquerda: " + valor); } else { System.out.println("ERRO: Lista vazia à Esquerda"); } break; 182 case 'P': case 'p': System.out.print("Valor à Pesquisar: "); String valorPesquisar = input.nextLine(); posicao = simples.pesquisar(valorPesquisar); if (posicao != -1) { System.out.println("Posição do Valor pesquisado: " + posicao); } else { System.out.println("ERRO: Valor não encontrado"); } break; case 'R': case 'r': simples.removeAll(); break; case 'C': case 'c': valor = simples.consultar(); if (valor.hashCode() != -999) { System.out.println("Valor Consultado à Esquerda: " + valor); } else { System.out.println("ERRO: Lista vazia à Esquerda"); } break; } } while (!strChr("Ff", op)); } public static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } Exemplo para testar o programa: Descritor: | null | 0 | Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: Ana <enter> Descritor: | progsimples.Nodo@6d6f6e28 | 1 | Lista Encadeada Simples: [Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: Beatriz <enter> Descritor: | progsimples.Nodo@135fbaa4 | 2 | Lista Encadeada Simples: [Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: Carla <enter> Descritor: | progsimples.Nodo@45ee12a7 | 3 | Lista Encadeada Simples: [Carla Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: p <enter> Valor à Pesquisar: Beatriz <enter> Posição do Valor pesquisado: 2 Descritor: | progsimples.Nodo@45ee12a7 | 3 | Lista Encadeada Simples: [Carla Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> Valor Consultado à Esquerda: Carla Descritor: | progsimples.Nodo@45ee12a7 | 3 | Lista Encadeada Simples: [Carla Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: Carla Descritor: | progsimples.Nodo@135fbaa4 | 2 | 183 Lista Encadeada Simples: [Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: Beatriz Descritor: | progsimples.Nodo@6d6f6e28 | 1 | Lista Encadeada Simples: [Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: Ana Descritor: | null | 0 | Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> ERRO: Lista vazia à Esquerda Descritor: | null | 0 | Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: f <enter> 12. Lista Duplamente Encadeada em Java Na lista duplamente encadeada (Figura 16), cada elemento possui um elo para o anterior (antecessor) e o posterior (sucessor), sendo que a lista pode ter ou não descritor. Descritor: Estrutura que normalmente armazena o primeiro elemento, a quantidade de elemen-tos e o último elemento da Lista. private Nodo primeiro; private int n; private Nodo ultimo; Problema: Escrever um programa em Java que insere, exclui, pesquisa, consulta e remove todos os dados em uma lista duplamente encadeada com descritor. Programa exemplo: Demonstra a “inclusão”, “exclusão”, “pesquisa”, “consulta”, “remoção completa” e “exibição” de números inteiros (à esquerda, à direita e na posição escolhida pelo usuário) em uma lista duplamente encadeada com descritor utilizando as classes: Nodo e Dupla. Figura 16: Lista Duplamente Encadeada // ------------------------------------------------------------------------------------------------------------------------------------------- Classe: Nodo.java package progdupla; public class Nodo { public Nodo anterior = null; public int info; public Nodo posterior = null; 184 } // --------------------------------------------------------------------------------------------------------------------------------------- Classe: Descritor.java package progdupla; public class Descritor { public Nodo primeiro; public int n; public Nodo ultimo; Descritor(Nodo primeiro, int n, Nodo ultimo) { this.primeiro = primeiro; this.n = 0; this.ultimo = ultimo; } } // ------------------------------------------------------------------------------------------------------------------------------------- Classe: ListaDupla.java package progdupla; public class ListaDupla { // ---------------------- atributos da classe Descritor descritor; // +----------------------------+ // | primeiro | n | último | // +---------------------------+ // ---------------------- construtor ListaDupla() { descritor = new Descritor(null, 0, null); } // inicializa descritor // ----------------------------------------------------------- métodos públicos da classe // ----------------------------------------------------------- incluirEsquerda public void incluirEsquerda(int valor) { Nodo ref = new Nodo(); ref.info = valor; if (descritor.n == 0) { descritor.ultimo = ref; } else { ref.posterior = descritor.primeiro; descritor.primeiro.anterior = ref; } descritor.n++; descritor.primeiro = ref; } // ----------------------------------------------------------- incluirDireita public void incluirDireita(int valor) { Nodo ref = new Nodo(); ref.info = valor; if (descritor.n == 0) { descritor.primeiro = ref; } else { ref.anterior = descritor.ultimo; descritor.ultimo.posterior = ref; } descritor.n++; descritor.ultimo = ref; } // ---------------------------------------------------------------------- incluirPosicao public void incluirPosicao(int valor, int posicao) { if (posicao >= 0 && posicao <= descritor.n) { Nodo ref = new Nodo(); ref.info = valor; Nodo aux = descritor.primeiro; if (posicao == 1) { incluirEsquerda(valor); 185 } else { if (posicao == descritor.n + 1) { incluirDireita(valor); } else { for (int i = 1; i < posicao - 1; i++) { aux = aux.posterior; } descritor.n++; ref.anterior = aux; ref.posterior = aux.posterior; aux.posterior.anterior = ref; aux.posterior = ref; } } } else { System.out.println("ERRO: Posição Inválida"); } } // ----------------------------------------------------------- excluirEsquerda public int excluirEsquerda() { if (descritor.n == 0) { return (-999); } else { Nodo ref = descritor.primeiro; int valor = ref.info; descritor.primeiro = ref.posterior; if (descritor.primeiro != null) { descritor.primeiro.anterior = null; } descritor.n--; if (descritor.n == 0) { descritor.ultimo = null; } return (valor); } } // ----------------------------------------------------------- excluirDireita public int excluirDireita() { if (descritor.n == 0) { return (-999); } else { Nodo ref = descritor.ultimo; int valor = ref.info; descritor.ultimo = ref.anterior; if (descritor.ultimo != null) { descritor.ultimo.posterior = null; } descritor.n--; if (descritor.n == 0) { descritor.primeiro = null; } return (valor); } } // ----------------------------------------------------------- excluirPosicao public int excluirPosicao(int posicao) { if (descritor.n == 0) { return (-999); } else { if (posicao == 1) { return (excluirEsquerda()); } else { if (posicao == descritor.n) { return (excluirDireita()); } else { 186 Nodo ref = descritor.primeiro; Nodo aux = ref; for (int i = 1; i < posicao; i++) { aux = ref; ref = ref.posterior; } int valor = ref.info; aux.posterior = ref.posterior; ref.posterior.anterior = aux; descritor.n--; if (descritor.n == 0) { descritor.ultimo = null; } return (valor); } } } } // ----------------------------------------------------------- pesquisar public int pesquisar(int valor) { if (descritor.n != 0) { Nodo ref = descritor.primeiro; int posicao = 1; while (ref != null) { if (ref.info == valor) { return (posicao); } ref = ref.posterior; posicao++; } } else { System.out.println("ERRO: Lista Vazia"); } return (-1); } // ----------------------------------------------------------- exibirEsquerda public void exibirEsquerda() { Nodo ref = descritor.primeiro; System.out.print("Lista pela Esquerda: ["); if (descritor.n == 0) { System.out.println("Vazia]"); } else { while (ref != null) { System.out.print(ref.info + " "); ref = ref.posterior; } System.out.println("\b]"); } } // ----------------------------------------------------------- exibirDireita public void exibirDireita() { Nodo ref = descritor.ultimo; System.out.print("Lista pela Direita: ["); if (descritor.n == 0) { System.out.println("Vazia]"); } else { while (ref != null) { System.out.print(ref.info + " "); ref = ref.anterior; } System.out.println("\b]"); } } 187 // ----------------------------------------------------------- exibirDescritor public void exibeDescritor() { System.out.println("Descritor: | " + descritor.primeiro + " | " + descritor.n + " | " + descritor.ultimo + " |"); } // ----------------------------------------------------------- removeAll public void removeAll() { descritor = new Descritor(null, 0, null); System.gc(); } // ----------------------------------------------------------- consultarEsquerda public int consultarEsquerda() { if (descritor.n == 0) { return (-999); } else { Nodo ref = descritor.primeiro; int valor = ref.info; return (valor); } } // ----------------------------------------------------------- consultarDireita public int consultarDireita() { if (descritor.n == 0) { return (-999); } else { Nodo ref = descritor.ultimo; int valor = ref.info; return (valor); } } // ----------------------------------------------------------- consultarPosicao public int consultarPosicao(int posicao) { if (descritor.n == 0) { return (-999); } else { if (posicao == 1) { return (consultarEsquerda()); } else { if (posicao == descritor.n) { return (consultarDireita()); } else { Nodo ref = descritor.primeiro; for (int i = 1; i < posicao; i++) { ref = ref.posterior; } int valor = ref.info; return (valor); } } } } // ---------------------- métodos privados da classe // ---------------------- métodos estáticos da classe } // ------------------------------------------------------------------------------------------------------------------- Programa Principal: ProgDupla.java package progdupla; import java.util.Scanner; public class ProgDupla { 188 public static void main(String[] args) { ListaDupla dupla = new ListaDupla(); Scanner input = new Scanner(System.in); char ch = 'T', op; int valor, posicao; do { dupla.exibeDescritor(); dupla.exibirDireita(); dupla.exibirEsquerda(); do { System.out.print("[I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: "); String s = input.nextLine(); op = s.charAt(0); } while (!strChr("IiEeCcPpRrFf", op)); if (strChr("Ff", op)) { System.exit(0); } if (strChr("IiEeCc", op)) { do { System.out.print("[E]squerda, [D]ireita ou [P]osição: "); String s = input.nextLine(); ch = s.charAt(0); } while (!strChr("DdEePp", ch)); } switch (op) { case 'I': case 'i': System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); switch (ch) { case 'D': case 'd': dupla.incluirDireita(valor); break; case 'E': case 'e': dupla.incluirEsquerda(valor); break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); dupla.incluirPosicao(valor, posicao); break; } break; case 'E': case 'e': switch (ch) { case 'D': case 'd': valor = dupla.excluirDireita(); if (valor != -999) { System.out.println("Valor Excluído à Direita: " + valor); } else { System.out.println("ERRO: Lista vazia à Direita"); } break; case 'E': case 'e': valor = dupla.excluirEsquerda(); if (valor != -999) { System.out.println("Valor Excluído à Esquerda: " + valor); } else { System.out.println("ERRO: Lista vazia à Esquerda"); } 189 break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); valor = dupla.excluirPosicao(posicao); if (valor != -999) { System.out.println("Valor Excluído na Posição: " + valor); } else { System.out.println("ERRO: Lista vazia na Posição"); } break; } break; case 'P': case 'p': System.out.print("Valor à Pesquisar: "); s = input.nextLine(); int valorPesquisar = Integer.parseInt(s); posicao = dupla.pesquisar(valorPesquisar); if (posicao != -1) { System.out.println("Posição do Valor pesquisado: " + posicao); } else { System.out.println("ERRO: Valor não encontrado"); } break; case 'R': case 'r': dupla.removeAll(); break; case 'C': case 'c': switch (ch) { case 'D': case 'd': valor = dupla.consultarDireita(); if (valor != -999) { System.out.println("Valor Consultado à Direita: " + valor); } else { System.out.println("ERRO: Lista vazia à Direita"); } break; case 'E': case 'e': valor = dupla.consultarEsquerda(); if (valor != -999) { System.out.println("Valor Consultado à Esquerda: " + valor); } else { System.out.println("ERRO: Lista vazia à Esquerda"); } break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); valor = dupla.consultarPosicao(posicao); if (valor != -999) { System.out.println("Valor Consultado na Posição: " + valor); } else { System.out.println("ERRO: Lista vazia na Posição"); } break; } break; } } while (!strChr("Ff", op)); } 190 public static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } Exemplo para testar o programa: Descritor: | null | 0 | null | Lista pela Direita: [Vazia] Lista pela Esquerda: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: e <enter> Valor: 10 <enter> Descritor: | progdupla.Nodo@3ed8d90c | 1 | progdupla.Nodo@3ed8d90c | Lista pela Direita: [10] Lista pela Esquerda: [10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: d <enter> Valor: 20 <enter> Descritor: | progdupla.Nodo@3ed8d90c | 2 | progdupla.Nodo@e91c310 | Lista pela Direita: [20 10] Lista pela Esquerda: [10 20] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: d <enter> Valor: 40 <enter> Descritor: | progdupla.Nodo@3ed8d90c | 3 | progdupla.Nodo@39d56e9 | Lista pela Direita: [40 20 10] Lista pela Esquerda: [10 20 40] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: p <enter> Valor: 30 <enter> Posição: 3 <enter> Descritor: | progdupla.Nodo@3ed8d90c | 4 | progdupla.Nodo@39d56e9 | Lista pela Direita: [40 30 20 10] Lista pela Esquerda: [10 20 30 40] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: p <enter> Valor à Pesquisar: 30 <enter> Posição do Valor pesquisado: 3 Descritor: | progdupla.Nodo@3ed8d90c | 4 | progdupla.Nodo@39d56e9 | Lista pela Direita: [40 30 20 10] Lista pela Esquerda: [10 20 30 40] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> [E]squerda, [D]ireita ou [P]osição: d <enter> Valor Consultado à Direita: 40 Descritor: | progdupla.Nodo@3ed8d90c | 4 | progdupla.Nodo@39d56e9 | Lista pela Direita: [40 30 20 10] Lista pela Esquerda: [10 20 30 40] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: f <enter> 191 13. Classe entrada de inteiros e reais em Java sem erro na digitação A seguir, são vistos dois programas em Java, cada um com as classes: EntradaDadosScanner e EntradaDadosSwing, respectivamente, e que permitem a entrada de dados via teclado de números inteiros (leInteiro) e reais (LeReal) sem erro de conversão (Integer.parseInt e Double.parseDouble) por descuido na digitação pelo usuário, ou seja, o usuário pode digitar qualquer coisa (em tese, por enquanto) que os métodos da classe eliminam os erros de digitação. Imagine a seguinte entrada de um inteiro e de um real em um programa Java com este tipo de digitação (em vermelho): Exemplo para testar o programa: Digite um Inteiro: -123 de oliveira 4,.56—78 <enter> Inteiro Digitado: 12345678 Digite um Real: -123,.,.45--,.56 <enter> Real Digitado: 123.4556 Analise a resposta em letras azuis. O programa eliminou todos os caracteres inválidos para um inteiro ou para um real, inclusive pontos (.) e vírgulas (,) repetidas e o sinal negativo (-) no local indevido. // --------------------------------------------------------------------------------- Programa Principal: ProgEntradaDadosScanner.java package progentradadadosscanner; public class ProgEntradaDadosScanner { public static void main(String[] args) { EntradaDadosScanner entrada = new EntradaDadosScanner(); int inteiro = entrada.leInteiro("Digite um Inteiro: "); System.out.println("Inteiro Digitado: " + inteiro); Double real = entrada.leReal("Digite um Real: "); System.out.println("Real Digitado: " + real); } } // ------------------------------------------------------------------------------------------------------- Classe: EntradaDadosScanner.java package progentradaDados; import java.util.Scanner; public class EntradaDadosScanner { // ------------------------------------------------------ métodos públicos da classe // -------------------------------------------------- leInteiro public int leInteiro(String mensagem) { Scanner input = new Scanner(System.in); String s; int limite, n; do { System.out.print(mensagem); s = input.nextLine(); s = s.replaceAll("[^0-9\\-]", ""); n = s.length(); // eliminar letras e caracteres não numéricos 192 if (n == 1 && s.charAt(0) == '-') { s = ""; } else { if (n > 0) { s = retiraNegativosForaLugar(s); if (s.charAt(0) == '-') { limite = 11; } else { limite = 10; } if (n >= limite) { s = verificaLimites(s); } } } } while (s.isEmpty()); int inteiro = Integer.parseInt(s); // conversão segura sem erros return (inteiro); } // ----------------------------------------------------------- leReal public double leReal(String mensagem) { Scanner input = new Scanner(System.in); String s; do { System.out.print(mensagem); s = input.nextLine(); s = s.replaceAll("[^0-9\\-.,]", ""); // eliminar letras s = verificaVirgulaPonto(s); s = retiraNegativosForaLugar(s); int n = s.length(); if (n == 1 && (s.charAt(0) == '-' || s.charAt(0) == '.')) { s = ""; } } while (s.isEmpty()); double real = Double.parseDouble(s); // conversão segura sem erros return (real); } // ----------------------------------------------------- métodos privados da classe // -------------------------------------------------- verificaVirgulaPonto private String verificaVirgulaPonto(String s) { int pontos = 0; char[] r = s.toCharArray(); int n = s.length(); for (int i = 0; i < n; i++) { if (r[i] == ',' || r[i] == '.') { r[i] = '.'; pontos++; } } if (pontos > 1) { r = retiraPontosRepetidos(r); } s = ""; for (int i = 0; i < r.length; i++) { s = s + r[i]; } return (s); } // ----------------------------------------------------------------------------- retiraPontosRepetidos private static char[] retiraPontosRepetidos(char[] s) { int n = s.length; String r = ""; boolean copiou = false; int j = 0; for (int i = 0; i < n; i++) { 193 if (s[i] != '.') { r = r + s[i]; j++; } else { if (!copiou) { r = r + '.'; copiou = true; } } } return (r.toCharArray()); } // ---------------------------------------------------------------------------------- retiraNegativosForaLugar private static String retiraNegativosForaLugar(String s) { String r = ""; int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) != '-' || i == 0) { r = r + s.charAt(i); } } return (r); } // ----------------------------------------------------------------- verificaLimites private static String verificaLimites(String s) { String limiteInferior = "-2147483648"; String limiteSuperior = "2147483647"; if (s.compareTo(limiteInferior) > 0 || s.compareTo(limiteSuperior) > 0) { System.out.println("ERRO: Excedeu o Limite dos Números Inteiros"); return (""); } return (s); } } A seguir uma outra versão utilizando o pacote swing. // -------------------------------------------------------------------------------------- Programa Principal: ProgEntradaDadosSwing.java package progentradadadosswing; import javax.swing.JOptionPane; public class ProgEntradaDadosSwing { public static void main(String[] args) { EntradaDadosSwing entrada = new EntradaDadosSwing(); int inteiro = entrada.leInteiro("Digite um Inteiro: "); JOptionPane.showMessageDialog(null, "Inteiro Digitado: " + inteiro); Double real = entrada.leReal("Digite um Real: "); JOptionPane.showMessageDialog(null, "Real Digitado: " + real); } } // ---------------------------------------------------------------------------------------------------------------------- Classe: EntradaDadosSwing.java package progentradadadosswing; import javax.swing.JOptionPane; public class EntradaDadosSwing { // ----------------------------------------------------- métodos públicos da classe // -------------------------------------------------- leInteiro 194 public int leInteiro(String mensagem) { String s; int n, limite; do { s = JOptionPane.showInputDialog(mensagem); s = s.replaceAll("[^0-9\\-]", ""); // eliminar letras e caracteres não numéricos n = s.length(); if (!(n == 1 && s.charAt(0) == '-')) { if (n > 0) { s = retiraNegativosForaLugar(s); if (s.charAt(0) == '-') { limite = 11; } else { limite = 10; } if (n >= limite) { s = verificaLimites(s); } } } else { s = ""; } } while (s.isEmpty()); int inteiro = Integer.parseInt(s); return (inteiro); } // ----------------------------------------------------------- leReal public double leReal(String mensagem) { String s; do { s = JOptionPane.showInputDialog(mensagem); s = s.replaceAll("[^0-9\\-.,]", ""); // eliminar letras digitadas incorretamente e que não s = verificaVirgulaPonto(s); // podem ser convertidas para double s = retiraNegativosForaLugar(s); int n = s.length(); if (n == 1 && (s.charAt(0) == '-' || s.charAt(0) == '.')) { s = ""; } } while (s.isEmpty()); double real = Double.parseDouble(s); return (real); } // --------------------------------------------------------------------- métodos privados da classe // --------------------------------------------------------------- verificaVirgulaPonto private String verificaVirgulaPonto(String s) { int pontos = 0; char[] r = s.toCharArray(); int n = s.length(); for (int i = 0; i < n; i++) { if (r[i] == ',' || r[i] == '.') { r[i] = '.'; pontos++; } } if (pontos > 1) { r = retiraPontosRepetidos(r); } s = ""; for (int i = 0; i < r.length; i++) { s = s + r[i]; } return (s); } // -------------------------------------------------------------------------- retiraPontosRepetidos 195 private static char[] retiraPontosRepetidos(char[] s) { int n = s.length; String r = ""; boolean copiou = false; int j = 0; for (int i = 0; i < n; i++) { if (s[i] != '.') { r = r + s[i]; j++; } else { if (!copiou) { r = r + '.'; copiou = true; } } } return (r.toCharArray()); } // ---------------------------------------------------------------------------------- retiraNegativosForaLugar private static String retiraNegativosForaLugar(String s) { String r = ""; int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) != '-' || i == 0) { r = r + s.charAt(i); } } return (r); } // ------------------------------------------------------------------- verificaLimites private static String verificaLimites(String s) { String limiteInferior = "-2147483648"; String limiteSuperior = "2147483647"; if (s.compareTo(limiteInferior) > 0 || s.compareTo(limiteSuperior) > 0) { JOptionPane.showMessageDialog(null, "ERRO: Excedeu o Limite dos Números Inteiros"); return (""); } return (s); } } 196 14. Alguns programas exemplos em Java A seguir são vistos quatro (4) exemplos da utilização das classes existentes do Java vistas no decorrer do livro. 14.1 Torre de Hanoi (Pilha - Stack) A seguir é visto a implementação de uma Torre de Hanoi (Figura 17) em Java usando a classe Stack (Pilha). Figura 17: Jogo Torre de Hanoi Regras do Jogo: a) Não se pode colocar um disco grande sobre um disco pequeno b) Ganha quando trocar todos os três discos de uma torre para outra // ---------------------------------------------------------------------------------------------------------- Programa Principal: ProgTorre.java package progtorre; import java.util.Stack; import java.util.Scanner; 197 public class ProgTorre { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); String s; int in, out; Stack p1 = new Stack(); Stack p2 = new Stack(); Stack p3 = new Stack(); boolean ganhou, moveu = false; p1.push(3); p1.push(2); p1.push(1); exibePilhas(p1, p2, p3); do { do { System.out.print("Move: "); s = entrada.nextLine(); in = Integer.parseInt(s); if (in == 0) { System.exit(0); } } while (in < 1 || in > 3); do { System.out.print("Para: "); s = entrada.nextLine(); out = Integer.parseInt(s); if (in == 0) { System.exit(0); } } while (out < 1 || out > 3); if (testaMovimento(p1, p2, p3, in)) { if (testaMaior(p1, p2, p3, in, out)) { moveu = movePilha(p1, p2, p3, in, out); } } exibePilhas(p1, p2, p3); if (moveu) { ganhou = testaVitoria(p1); if (ganhou) { System.out.println("Status: VENCEDOR (p1)"); System.exit(0); } ganhou = testaVitoria(p2); if (ganhou) { System.out.println("Status: VENCEDOR (p2)"); System.exit(0); } ganhou = testaVitoria(p3); if (ganhou) { System.out.println("Status: VENCEDOR (p3)"); System.exit(0); } } } while (true); } // ------------------------------------------------------ testaVitoria static boolean testaVitoria(Stack p1) { int a, b, c; a = p1.search(1); b = p1.search(2); c = p1.search(3); if (a != -1 && b != -1 && c != -1) { return(true); } 198 else { return(false); } } // ---------------------------------------------------------------------------------------------------- testaMaior static boolean testaMaior(Stack p1, Stack p2, Stack p3, int in, int out) { Object nodo; int a = 0, b = 0; switch (in) { case 1: nodo = p1.peek(); a = nodo.hashCode(); break; case 2: nodo = p2.peek(); a = nodo.hashCode(); break; case 3: nodo = p3.peek(); a = nodo.hashCode(); break; } switch (out) { case 1: if (p1.empty()) { return(true); } else { nodo = p1.peek(); b = nodo.hashCode(); } break; case 2: if (p2.empty()) { return(true); } else { nodo = p2.peek(); b = nodo.hashCode(); } break; case 3: if (p3.empty()) { return(true); } else { nodo = p3.peek(); b = nodo.hashCode(); } break; } if (a < b) return(true); else { return(false); } } // --------------------------------------------------------------------------------------------------- testaMovimento static boolean testaMovimento(Stack p1, Stack p2, Stack p3, int in) { boolean pode = false; switch (in) { case 1: if (p1.empty()) { System.out.println("Status: Impossivel mover (p1)"); } else { pode = true; } break; case 2: if (p2.empty()) { System.out.println("Status: Impossivel mover (p2)"); 199 } else { pode = true; } break; case 3: if (p3.empty()) { System.out.println("Status: Impossivel mover (p3)"); } else { pode = true; } break; } return(pode); } // -------------------------------------------------------------------------------------------------- movePilha static boolean movePilha(Stack p1, Stack p2, Stack p3, int a, int b) { Object nodo; int in = 0; boolean moveu = false; switch (a) { case 1: if (!p1.empty()) { nodo = p1.pop(); in = nodo.hashCode(); } else { in = 0; } break; case 2: if (!p2.empty()) { nodo = p2.pop(); in = nodo.hashCode(); } else { in = 0; } break; case 3: if (!p3.empty()) { nodo = p3.pop(); in = nodo.hashCode(); } else { in = 0; } break; } if (in != 0) { switch (b) { case 1: p1.push(in); moveu = true; break; case 2: p2.push(in); moveu = true; break; case 3: p3.push(in); moveu = true; break; } } return(moveu); } // --------------------------------------------------------------------------------- exibePilhas static void exibePilhas(Stack p1, Stack p2, Stack p3) { System.out.println("p1: " + p1); System.out.println("p2: " + p2); 200 System.out.println("p3: " + p3); } Observação: Substitua o método exibePilhas pelo método abaixo. // ------------------------------------------------------------------------------- exibePilhas static void exibePilhas(Stack p1, Stack p2, Stack p3) { char a1 = '|', a2 = '|', a3 = '|'; char b1 = '|', b2 = '|', b3 = '|'; char c1 = '|', c2 = '|', c3 = '|'; Object nodo; nodo = p1.search(1); a1 = nodo.toString().charAt(0); if (a1 != '-') { a1 = '1'; } nodo = p1.search(2); a2 = nodo.toString().charAt(0); if (a2 != '-') { a2 = '2'; } nodo = p1.search(3); a3 = nodo.toString().charAt(0); if (a3 != '-') { a3 = '3'; } nodo = p2.search(1); b1 = nodo.toString().charAt(0); if (b1 != '-') { b1 = '1'; } nodo = p2.search(2); b2 = nodo.toString().charAt(0); if (b2 != '-') { b2 = '2'; } nodo = p2.search(3); b3 = nodo.toString().charAt(0); if (b3 != '-') { b3 = '3'; } nodo = p3.search(1); c1 = nodo.toString().charAt(0); if (c1 != '-') { c1 = '1'; } nodo = p3.search(2); c2 = nodo.toString().charAt(0); if (c2 != '-') { c2 = '2'; } nodo = p3.search(3); c3 = nodo.toString().charAt(0); if (c3 != '-') { c3 = '3'; } if (c3 == '-' && c2 == '-' && c1 != '-') { c3 = c1; c1 = '-'; } if (c3 == '-' && c2 != '-' && c1 == '-') { c3 = c2; c2 = '-'; } 201 if (c3 == '-' && c2 != '-' && c1 != '-') { c3 = c2; c2 = c1; c1 = '-'; } if (b3 == '-' && b2 == '-' && b1 != '-') { b3 = b1; b1 = '-'; } if (b3 == '-' && b2 != '-' && b1 == '-') { b3 = b2; b2 = '-'; } if (b3 == '-' && b2 != '-' && b1 != '-') { b3 = b2; b2 = b1; b1 = '-'; } if (a3 == '-' && a2 == '-' && a1 != '-') { a3 = a1; a1 = '-'; } if (a3 == '-' && a2 != '-' && a1 == '-') { a3 = a2; a2 = '-'; } if (a3 == '-' && a2 != '-' && a1 != '-') { a3 = a2; a2 = a1; a1 = '-'; } System.out.printf(" %c %c %c \n", a1, b1, c1); System.out.printf(" %c %c %c \n", a2, b2, c2); System.out.printf(" %c %c %c \n", a3, b3, c3); System.out.printf("--------- --------- ---------\n"); System.out.printf(" p1 p2 p3\n\n"); } } 14.2 Analisador de Expressões usando Stack Programa abaixo implementa um Analisador de Expressões utilizando a classe Java Stack. O programa resolve expressões do tipo: (4*(5+(4*3)/(3-1))) ou (3*(4+5)) Exemplo de entrada de dados: Expressão: (4*(5+(4*3)/(3-1))) <enter> // ----------------------------------------------------------------------------------------- Programa Principal: ProgAnalisaExpressao.java package proganalisaexpressao; import java.util.Stack; import java.util.Scanner; public class ProgAnalisaExpressao { public static void main(String[] args) { Stack numeros = new Stack(); Stack operadores = new Stack(); Scanner entrada = new Scanner(System.in); String s; float resp; System.out.print("Expressao: "); 202 s = entrada.nextLine(); int n = s.length(); if (testaExpressao(s)) { for (int i = 0;i < n;i++) { if (s.charAt(i) == '(') { continue; } if ("0123456789".indexOf(s.charAt(i)) != -1) { char ch = s.charAt(i); float t = (float) ch - 48; numeros.push(t); exibePilha(numeros); exibePilha(operadores); System.out.println(); } else { if ("+-*/".indexOf(s.charAt(i)) != -1) { char op = s.charAt(i); operadores.push(op); } } if (s.charAt(i) == ')') { Object nodo = numeros.pop(); String st = nodo.toString(); float y = Float.parseFloat(st); nodo = numeros.pop(); st = nodo.toString(); float x = Float.parseFloat(st); nodo = operadores.pop(); String temp = nodo.toString(); char op = temp.charAt(0); resp = calculaOperacao(x, y, op); numeros.push(resp); exibePilha(numeros); exibePilha(operadores); } } System.out.println(); if (operadores.empty()) { Object nodo = numeros.pop(); String st = nodo.toString(); resp = Float.parseFloat(st); } else { resp = 0; while (!operadores.empty()) { Object nodo = numeros.pop(); String st = nodo.toString(); float y = Float.parseFloat(st); nodo = numeros.pop(); st = nodo.toString(); float x = Float.parseFloat(st); nodo = operadores.pop(); String temp = nodo.toString(); char op = temp.charAt(0); resp = calculaOperacao(x, y, op); numeros.push(resp); exibePilha(numeros); exibePilha(operadores); } } System.out.println("Resposta: " + resp); } else { System.out.println("Erro: Expressao Invalida"); } } 203 // ---------------------------------------- calculaOperacao static float calculaOperacao(float x, float y, char op) { float resp = 0; switch (op) { case '+': resp = x + y; break; case '-': resp = x - y; break; case '*': resp = x * y; break; case '/': if (y != 0) { resp = x / y; } else { System.out.println("Erro Fatal: Divisão por Zero"); System.exit(0); } break; } return(resp); } // ------------------------------------------------------------------ testaExpressao static boolean testaExpressao(String exp) { int abre = 0, fecha = 0; for (int i = 0;i < exp.length();i++) { if (exp.charAt(i) == '(') { abre++; } if (exp.charAt(i) == ')') { fecha++; } } if (abre == fecha) { return(true); } else return(false); } // ------------------------------------------------------- exibePilha static void exibePilha(Stack pilha) { Object [] nodo = pilha.toArray(); System.out.print("Pilha: "); for (int i = 0;i < nodo.length;i++) { System.out.print(nodo[i] + " "); } System.out.println(); } } Exemplo para testar o programa: Expressão: (4*(5+(4*3)/(3-1))) <enter> Pilha: 4 Pilha: Pilha: 5 4 Pilha: * Pilha: 4 5 4 Pilha: + * Pilha: 3 4 5 4 204 Pilha: * + * Pilha: 12 5 4 Pilha: + * Pilha: 3 12 5 4 Pilha: / + * Pilha: 1 3 12 5 4 Pilha: - / + * Pilha: 2 12 5 4 Pilha: / + * Pilha: 6 5 4 Pilha: + * Pilha: 11 4 Pilha: * Pilha: 44 Pilha: Resposta: 44 14.3 Calculadora Polonesa Reversa A seguir, o programa implementa uma calculadora Polonesa Reversa, ou seja, o usuário digita primeiro dois valores e depois o operador. Exemplo para testar o programa: Polonesa Reversa: <enter> abandona 3 <enter> 2 <enter> / <enter> 1.5 2 <enter> * <enter> 3 <enter> by Polonesa Reversa // -------------------------------------------------------------------------------------- Programa Prinicpal: ProgPolonesaReversa.java package progpolonesareversa; public class ProgPolonesaReversa { public static void main(String[] args) { PolonesaReversa polonesa = new PolonesaReversa(); polonesa.calculaPolonesaReversa(); } } // -------------------------------------------------------------------------------------------------------- Classe: PolonesaReversa.java package progpolonesareversa; import java.util.Scanner; public class PolonesaReversa { // --------------------------------------------------- atributos da classe private double x, y, resp = 0; private char op; private int erro; 205 // ----------------------------------------------------- métodos públicos da classe public PolonesaReversa () { // construtor erro = 0; } public void calculaPolonesaReversa() { Scanner entrada = new Scanner(System.in); String s; System.out.println("Polonesa Reversa: <enter> abandonar"); do { if (resp == 0) { s = entrada.nextLine(); if (s.equals("")) { System.out.println("by Polonesa Reversa"); System.exit(0); } s = s.replaceAll("[^0-9\\-.]", ""); // elimina letras digitadas incorretamente x = Double.parseDouble(s); } else { x = resp; } s = entrada.nextLine(); if (s.equals("")) { System.out.println("by Polonesa Reversa"); System.exit(0); } s = s.replaceAll("[^0-9\\-.]", ""); // elimina letras digitadas incorretamente y = Double.parseDouble(s); do { s = entrada.nextLine(); if (s.equals("")) { System.out.println("by Polonesa Reversa"); System.exit(0); } op = s.charAt(0); } while (!strChr("+-*/Pp", op)); operaCalculadora(); exibeCalculadora(); } while (!s.equals("")); } // ---------------------------------------------------- operaCalculadora private void operaCalculadora() { switch (op) { case '+': resp = soma(x, y); break; case '-': resp = subtracao(x, y); break; case '*': resp = multiplicacao(x, y); break; case '/': if (y == 0) erro = 1; // divisão por zero else resp = divisao(x, y); break; case 'P': case 'p': resp = power(x, y); // potência break; } } // ---------------------------------------------------- exibeCalculadora private void exibeCalculadora() { switch (erro) { case 1: System.out.println("Erro: Divisão por Zero"); 206 break; case 2: System.out.println("Erro: Raiz Complexa"); break; case 3: System.out.println("Erro: Tangente Inválida"); break; default: System.out.println(resp); } } // ................................................ métodos privados da classe // ---------------------------- strChr private boolean strChr(String s, char ch) { for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } // ------------------------------------------------------------ soma private double soma(double x, double y) { return(x + y); } // ----------------------------------------------------------------- subtração private double subtracao(double x, double y) { return(x - y); } // ------------------------------------------------------------------------- multiplicação private double multiplicacao(double x, double y) { return(x * y); } // -------------------------------------------------------------- divisão private double divisao(double x, double y) { if (y == 0) { erro = 1; return(-1); } return(x / y); } // ---------------------------------------------------------------- power private double power(double x, double y) { return(Math.pow(x, y)); } } 14.4 Jogo Quebra-Cabeças A seguir é visto a implementação de um jogo chamado Quebra-Cabeças (Figura 18), cujo objetivo é colocar os números de 1 à 8 em ordem crescente, conforme exemplo abaixo: 207 Figura 18: Jogo Quebra-Cabeças // ------------------------------------------------------------------------------------------------ Programa Principal: ProgQuebraCabeca.java package progquebracabeca; public class ProgQuebraCabeca { public static void main(String[] args) { Tabuleiro tabuleiro = new Tabuleiro(); tabuleiro.sorteiaNumeros(); tabuleiro.exibeTabuleiro(); tabuleiro.jogadasJogador(); } } // ---------------------------------------------------------------------------------------------------------------------- Classe: Tabuleiro.java package progcabeca; import java.util.Scanner; public class Tabuleiro { private final int [][] matriz = new int [3][3]; private final int [][] certa = {{1, 2, 3}, {4, 5, 6}, {7, 8, 0}}; private int jogadas = 0; // ------------------------------------------------- verificaVitoria private boolean verificaVitoria() { for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c] != certa[l][c]) { return(false); } } } return(true); } // ---------------------------------------------------------------- verificaDeslocamento private void verificaDeslocamento(int num) { int lin = 0, col = 0; int ll = 0, cc = 0; for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c] == num) { lin = l; col = c; } } } 208 for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c] == 0) { ll = l; cc = c; } } } if ((lin == ll || col == cc) && ((ll-lin == 1 || lin-ll == 1) || (cc-col == 1 || col-cc == 1))){ matriz[ll][cc] = num; matriz[lin][col] = 0; exibeTabuleiro(); } else { System.out.println("Status: Movimento Inválido"); } if (verificaVitoria()) { System.out.println("Vitória"); System.exit(0); } } // ----------------------------------------------------- jogadasJogador public void jogadasJogador() { Scanner input = new Scanner(System.in); char tecla; do { System.out.print("Move (" + jogadas + "): "); String s = input.nextLine(); tecla = s.charAt(0); if (strChr("12345678", tecla)) { verificaDeslocamento(tecla-48); jogadas++; if (jogadas == 99) { System.out.println("Game Over"); System.exit(0); } } } while (tecla != '0'); } // --------------------------------------------- exibeTabuleiro public void exibeTabuleiro() { for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c] != 0) { System.out.printf("%2d ", matriz[l][c]); } else { System.out.printf(" "); } } System.out.println(); } } // ----------------------------------------------- sorteiaNumeros public void sorteiaNumeros() { for (int i = 1;i <= 8;i++) { boolean ok = false; do { int l = (int) (Math.random() * 3); int c = (int) (Math.random() * 3); if (matriz[l][c] == 0) { matriz[l][c] = i; ok = true; 209 } } while (!ok); } } // ------------------------------------------------------------- strChr private boolean strChr(String s, char tecla) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charAt(i) == tecla) { return(true); } } return(false); } } 210 Anexos: Solução dos problemas propostos no Livro Anexo 1.4 Solução da Lista: Classes 1.4.1 ProgCirculo // ------------------------------------------------------------------------------------------------ Classe: Circulo.java package progcirculo; public class Circulo { // ---------------------------- atributos da classe private double raio; private double area; // --------------------------- construtor // ---------------------------------------------------- métodos públicos da classe public void setRaio(double raio) { this.raio = raio; } public void calculaArea() { area = Math.PI * Math.pow(raio, 2); } public double getArea() { return (area); } // ---------------------- métodos privados da classe // ---------------------- métodos estáticos da classe } // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgCirculo.java package progcirculo; public class ProgCirculo { public static void main(String[] args) { Circulo circ = new Circulo(); circ.setRaio(3); circ.calculaArea(); double area = circ.getArea(); System.out.printf("Área: %.2f\n", area); } } 1.4.2 ProgPeso // ------------------------------------------------------------------------------------------------------------ Classe: PesoIdeal.java package progpeso; public class PesoIdeal { // ---------------------------- atributos de classe private char sexo; private double altura; private double pesoIdeal; // ----------------------------------------------------- construtor da classe PesoIdeal(char sexo, double altura) { 211 this.sexo = sexo; this.altura = altura; } // -------------------------------------------------- métodos públicos da classe public void calculaPesoIdeal() { switch (sexo) { case 'H': case 'h': pesoIdeal = 72.7 * altura - 58.0; break; case 'M': case 'm': pesoIdeal = 62.1 * altura - 44.7; break; default: System.out.println("ERRO: Sexo Inválido"); } } public double getPesoIdeal() { return (pesoIdeal); } // ------------------------ métodos privados da classe // ------------------------ métodos estáticos da classe } // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgPeso.java package progpeso; public class ProgPeso { public static void main(String[] args) { PesoIdeal piHomem = new PesoIdeal('H', 1.67); // sexo, altura PesoIdeal piMulher = new PesoIdeal('m', 1.65); // sexo, altura piHomem.calculaPesoIdeal(); System.out.printf("Peso Ideal Homem: %.2f\n", piHomem.getPesoIdeal()); piMulher.calculaPesoIdeal(); System.out.printf("Peso Ideal Mulher: %.2f\n", piMulher.getPesoIdeal()); } } 1.4.3 ProgValidaCPF // ----------------------------------------------------------------------------------------------------------------------------- Classe: CPF.java package progvalidacpf; public class CPF { // ---------------------------- atributos da classe private String cpf; private int digito; // ------------------------------ construtor da classe CPF(String cpf) { this.cpf = cpf; } // ------------------------------------ métodos públicos da classe public int verificaCPF() { int soma = 0; int x = 10; int n = cpf.length(); 212 for (int i = 0;i < n;i++) { soma = soma + (cpf.charAt(i) - 48) * x; x--; } System.out.println("Soma: " + soma); int digito1 = 11 - soma % 11; if (digito1 == 10 || digito1 == 11) { digito1 = 0; } System.out.println("Digito 1: " + digito1); cpf = cpf + digito1; System.out.println("CPF: " + cpf); soma = 0; x = 11; n = cpf.length(); for (int i = 0;i < n;i++) { soma = soma + (cpf.charAt(i) - 48) * x; x--; } System.out.println("Soma: " + soma); int digito2 = 11 - soma % 11; if (digito2 == 10 || digito2 == 11) { digito2 = 0; } System.out.println("Digito 2: " + digito2); digito = digito1 * 10 + digito2; return(digito); // converte char para int // 48 é o código ascii do zero } // --------------------- métodos privados da classe // --------------------- métodos estáticos da classe } // -------------------------------------------------------------------------------------------------- Programa Principal: ProgValidaCPF.java package progvalidacpf; public class ProgValidaCPF { public static void main(String[] args) { String s = "123456789"; CPF cpf = new CPF(s); int digitoVerificador = cpf.verificaCPF(); System.out.printf("Digito verificador: %02d\n", digitoVerificador); System.out.printf("CPF: %s-%02d\n", s , digitoVerificador); } } 1.4.4 ProgDiaSemana // --------------------------------------------------------------------------------------------------------------- Classe: DiaSemana.java package progdiasemana; public class DiaSemana { // ------------------------------ atributos da classe private int dia; private int mes; private int ano; private String semana; // ---------------------------------------------------- construtor DiaSemana(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; } 213 //------------------------------------------------------- métodos públicos da classe public void verificaDiaSemana() { int numeroDias = (ano - 1901) * 365 + (ano - 1901) / 4 + dia + (mes - 1) * 31 - ((mes * 4 + 23) / 10) * ((mes + 12) / 15) + ((4 - ano % 4) / 4) * ((mes + 12) / 15); int resto = numeroDias % 7; switch (resto) { case 0: semana = "segunda-feira"; break; case 1: semana = "terça-feira"; break; case 2: semana = "quarta-feira"; break; case 3: semana = "quinta-feira"; break; case 4: semana = "sexta-feira"; break; case 5: semana = "sábado"; break; case 7: semana = "domingo"; break; } } public void exibeDiaSemana() { System.out.printf("%02d/%02d/%4d é um(a) %s\n", dia, mes, ano, semana); } } // ------------------------------------------------------------------------------------------------------------ Programa Principal: ProgDiaSemana.java package progdiasemana; public class ProgDiaSemana { public static void main(String[] args) { DiaSemana dia = new DiaSemana(10, 2, 1962); dia.verificaDiaSemana(); dia.exibeDiaSemana(); } } 1.4.5 ProgTestData // ------------------------------------------------------------------------------------------------------------------------- Classe: Data.java package progtestdata; public class Data { // ------------------------------ atributos da classe private int dia; private int mes; private int ano; // ------------------------------ construtor da classe // ---------------------------------------- métodos públicos da classe public void setDia(int dia) { if (dia >= 1 && dia <= 31) { this.dia = dia; } else { this.dia = 1; System.out.println("ERRO: Dia Inválido"); } } 214 public void setMes(int mes) { if (mes >= 1 && mes <= 12) { this.mes = mes; } else { this.mes = 1; System.out.println("ERRO: Mês Inválido"); } } public void setAno(int ano) { this.ano = ano; } public void setData(int dia, int mes, int ano) { setDia(dia); setMes(mes); setAno(ano); } public void extenso() { String [] nomeMes = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"}; System.out.printf("Data: %d de %s de %d\n", dia, nomeMes[mes - 1], ano); } // ------------------------------ métodos privados da classe // ------------------------------ métodos estáticos da classe } // ------------------------------------------------------------------------------------------------ Programa Principal: ProgTestData.java package progtestdata; public class ProgTestData { public static void main(String[] args) { Data data = new Data(); data.setData(25, 8, 2014); data.extenso(); } } 1.4.6 ProgVetorSort // ----------------------------------------------------------------------------------------------------------------------- Classe: Vetor.java package progvetorsort; public class Vetor { // -------------------------- atributos da classe private int[] vetor; private int n; private final int max; // ------------------------------------------- construtor Vetor(int numeroElementos) { max = numeroElementos; vetor = new int[max]; n = 0; } // --------------------------------------- add public void add(int valor) { 215 if (n < max) { vetor[n] = valor; n++; } else { System.out.println("ERRO: Excedeu o Limite do Vetor"); } } // --------------------------- remove public void del() { if (n > 0) { n--; } else { System.out.println("ERRO: Vetor Vazio"); } } // ------------------------------------------------------------ removeElemento public void removeElemento(int valor) { if (n > 0) { for (int i = 0; i < n; i++) { if (valor == vetor[i]) { for (int j = i; j < n - 1; j++) { vetor[j] = vetor[j + 1]; } n--; break; } } } else { System.out.println("ERRO: Vetor Vazio"); } } // ------------------------------------------------------------- removePosicao public void removePosicao(int posicao) { if (n > 0 && posicao > 0 && posicao < n) { for (int j = posicao; j < n - 1; j++) { vetor[j] = vetor[j + 1]; } n--; } else { System.out.println("ERRO: Vetor Vazio"); } } // --------------------------------------- primeiro public int primeiro() { if (n > 0) { return (vetor[0]); } else { return (-1); } } // --------------------------------- ultimo public int ultimo() { if (n > 0) { return (vetor[n - 1]); } else { return (-1); } } // ----------------------------------- exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n - 1; i++) { 216 System.out.print(vetor[i] + " "); } System.out.println(vetor[n - 1] + "]"); } // ----------------------------------------- length public int length() { return (n); } // -------------------------------------------------- existe public boolean existe(int valor) { for (int i = 0; i < n; i++) { if (vetor[i] == valor) { return (true); } } return (false); } // -------------------------------------- bubbleSort public void bubbleSort() { int u = n - 1; boolean trocou; int vezes = 0; do { trocou = false; for (int i = 0; i < u; i++) { if (vetor[i] > vetor[i + 1]) { trocou = true; int temp = vetor[i]; vetor[i] = vetor[i + 1]; vetor[i + 1] = temp; } } u--; } while (trocou); } // ------------------------------------ forcaBruta public void forcaBruta() { int u = n - 1; for (int i = 0; i < u; i++) { for (int j = i + 1; j <= u; j++) { if (vetor[i] > vetor[j]) { int temp = vetor[i]; vetor[i] = vetor[j]; vetor[j] = temp; } } } } } // ------------------------------------------------------------------------------------------------ Programa Principal: ProgVetorSort.java package progvetorsort; public class ProgVetorSort { public static void main(String[] args) { Vetor vetor = new Vetor(5); vetor.add(40); vetor.add(20); vetor.add(30); 217 vetor.add(50); vetor.add(10); vetor.exibe(); vetor.add(60); vetor.exibe(); vetor.forcaBruta(); vetor.exibe(); vetor.bubbleSort(); vetor.exibe(); } } 1.4.7 ProgPessoa // ------------------------------------------------------------------------------------------------------------------------ Classe: Pessoa.java package progpessoa; import java.util.Date; public class Pessoa { // -------------------------------- atributos da classe private String nome; private int ano; private int idade; private char sexo; // ---------------------- construtor // -------------------------------------------------------- métodos públicos da classe public void setNome(String nome) { this.nome = nome; } public void setAno(int ano) { this.ano = ano; } public void setSexo(char sexo) { this.sexo = sexo; } public void setDados(String nome, int ano, char sexo) { setNome(nome); setAno(ano); setSexo(sexo); } public void calculaIdade() { Date date = new Date(); // carrega a data do sistema String data = date.toString(); // converte para String String [] partes = data.split(" "); // parte a data em pedaços int n = partes.length; // descobre o número de padaços int anoAtual = Integer.parseInt(partes[n-1]); // pega o último pedaço, aonde está o ano atual idade = anoAtual - ano; } public void exibePessoa() { System.out.println("Nome: " + nome); System.out.println("Idade: " + idade + " ano(s)"); switch (sexo) { case 'M': case 'm': System.out.println("Sexo: Masculino"); break; case 'F': case 'f': System.out.println("Sexo: Feminino"); break; 218 } } // ---------------------- métodos privados da classe // ---------------------- métodos estátivos da classe } // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoa.java package progpessoa; public class ProgPessoa { public static void main(String[] args) { Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa(); Pessoa p3 = new Pessoa(); p1.setDados("Paulo Roberto", 1962, 'm'); p2.setDados("Renato Luis", 1965, 'm'); p3.setDados("Francisco Carlos", 1959, 'm'); p1.calculaIdade(); p2.calculaIdade(); p3.calculaIdade(); p1.exibePessoa(); p2.exibePessoa(); p3.exibePessoa(); } } 1.4.8 ProgPessoa2 // ----------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package progpessoa2; import java.util.Date; public class Pessoa { // --------------------------------- atributos da classe private String nome; private int ano; private int idade; private char sexo; // ---------------------- construtor // ------------------------------------------------------ métodos públicos da classe public void setNome(String nome) { this.nome = nome; } public void setAno(int ano) { this.ano = ano; } public void setSexo(char sexo) { this.sexo = sexo; } public void setDados(String nome, int ano, char sexo) { setNome(nome); setAno(ano); setSexo(sexo); } public void calculaIdade() { 219 Date date = new Date(); String data = date.toString(); String [] partes = data.split(" "); int n = partes.length; int anoAtual = Integer.parseInt(partes[n-1]); idade = anoAtual - ano; // carrega a data do sistema // converte para String // parte a data em pedaços // descobre o número de pedaços // pega o último pedaço, aonde está o ano atual } public void exibePessoa() { System.out.println("Nome: " + nome); System.out.println("Idade: " + idade + " ano(s)"); switch (sexo) { case 'M': case 'm': System.out.println("Sexo: Masculino"); break; case 'F': case 'f': System.out.println("Sexo: Feminino"); break; } } // ---------------------- métodos privados da classe // ---------------------- métodos estátivos da classe } // -------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoa2.java package progpessoa2; public class ProgPessoa2 { public static void main(String[] args) { Pessoa [] pessoa = new Pessoa[3]; pessoa[0] = new Pessoa(); pessoa[0].setDados("Paulo Roberto", 1962, 'm'); pessoa[0].calculaIdade(); pessoa[0].exibePessoa(); pessoa[1] = new Pessoa(); pessoa[1].setDados("Renato Luis", 1960, 'm'); pessoa[1].calculaIdade(); pessoa[1].exibePessoa(); pessoa[2] = new Pessoa(); pessoa[2].setDados("Francisco Carlos", 1959, 'm'); pessoa[2].calculaIdade(); pessoa[2].exibePessoa(); } } 1.4.9 ProgPessoas // ----------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package progpessoas; public class Pessoa { // ---------------------------------- atributos da classe private String[] nome; private int[] idade; private int n; private final int max; // ------------------------------------------ construtor Pessoa(int numeroPessoas) { this.max = numeroPessoas; 220 nome = new String[this.max]; idade = new int[this.max]; this.n = 0; } // ---------------------------------------------------------------------- métodos públicos da classe public void insereDados(String nome, int idade) { if (n < max) { this.nome[n] = nome; this.idade[n] = idade; n++; } else { System.out.println("ERRO: Vetor Lotado"); } } public void exibeDados() { System.out.println("Lista de Pessoas"); for (int i = 0; i < n; i++) { System.out.printf("Nome: %-10s Idade: %d\n", nome[i], idade[i]); } } public void sort() { for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (nome[i].compareTo(nome[j]) > 0) { String temp = nome[i]; nome[i] = nome[j]; nome[j] = temp; int t = idade[i]; idade[i] = idade[j]; idade[j] = t; } } } } // ---------------------- métodos privados da classe // ---------------------- métodos estátivos da classe } // -------------------------------------------------------------------------------------------------------- Programa Principal: ProgPessoas.java package progpessoas; public class ProgPessoas { public static void main(String[] args) { Pessoa pessoa = new Pessoa(7); pessoa.insereDados("Beatriz", 11); pessoa.insereDados("Debora", 13); pessoa.insereDados("Fátima", 15); pessoa.insereDados("Geni", 16); pessoa.insereDados("Carla", 12); pessoa.insereDados("Eva", 14); pessoa.insereDados("Ana", 10); pessoa.exibeDados(); pessoa.sort(); pessoa.exibeDados(); } } 1.4.10 ProgAgenda // ---------------------------------------------------------------------------------------------------------------------------- Classe: Agenda.java 221 package progagenda; public class Agenda { // ----------------------------- atributos da classe private String [] nome; private String [] fone; private int n; private final int max; // --------------------------------------------- construtor Agenda(int numeroPessoas) { this.max = numeroPessoas; nome = new String[this.max]; fone = new String[this.max]; this.n = 0; } // ----------------------------------------------------------------------------------------- métodos públicos da classe public void insereTelefone(String nome, String fone) { if (n < max) { this.nome[n] = nome; this.fone[n] = fone; n++; } else { System.out.println("ERRO: Agenda Lotada"); } } public String consultaNome(String fone) { String nome; for (int i = 0;i < n;i++) { if (this.fone[i].compareTo(fone) == 0) { return(this.nome[i]); } } return(""); } // ----------------------------- métodos privados da classe // ----------------------------- métodos estáticos da classe } // -------------------------------------------------------------------------------------------------- Programa Principal: ProgAgenda.java package progagenda; public class ProgAgenda { public static void main(String[] args) { Agenda agenda = new Agenda(5); agenda.insereTelefone("Ana", "9981-1234"); agenda.insereTelefone("Beatriz", "9981-2345"); agenda.insereTelefone("Carla", "9981-3456"); agenda.insereTelefone("Debora", "9981-4567"); agenda.insereTelefone("Eva", "9981-5678"); agenda.insereTelefone("Fátima", "9981-6789"); String fone = "99815678"; String nome = agenda.consultaNome(fone); if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usuário não Encontrado"); } fone = "9981-0123"; nome = agenda.consultaNome(fone); 222 if (nome.compareTo("") != 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); } else { System.out.println("ERRO: Usuário não Encontrado"); } } } Anexo 2.3 Solução da Lista: Interface e Polimorfismo 2.3.1 ProgInterface_1 // -------------------------------------------------------------------------------------------------- Programa Principal: ProgInterface_1.java package proginterface_1; public class ProgInterface_1 { public static void main(String[] args) { Cardeal cardeal = new Cardeal("Cardeal", "Vermelho", "Cinza"); CardealBanhado cardealBanhado = new CardealBanhado("Cardeal Banhado", "Vermelho", "preto"); cardeal.exibeNome(); cardeal.exibeCores(); cardealBanhado.exibeNome(); cardealBanhado.exibeCores(); } } // ------------------------------------------------------------------------------------------------------------------------ Interface: Passaro.java package proginterface_1; public interface Passaro { public final int numeroPatas = 2; public abstract void exibeNome(); public abstract void exibeCores(); } // ----------------------------------------------------------------------------------------------------------------------- Classe: Cardeal.java package proginterface_1; public class Cardeal implements Passaro { // ---------------------------------------- atributos da classe private final String nome; private final String cor_topete; private final String cor_corpo; Cardeal(String nome, String cor_topete, String cor_corpo) { this.nome = nome; this.cor_topete = cor_topete; this.cor_corpo = cor_corpo; } @Override public void exibeNome() { System.out.println("Nome do Pássaro: " + nome); System.out.println("Número de Patas: " + numeroPatas); } @Override public void exibeCores() { System.out.println("Cor do Topete: " + cor_topete); 223 System.out.println("Cor do Corpo: " + cor_corpo); } } // -------------------------------------------------------------------------------------------------------- Classe: CardealBanhado.java package proginterface_1; public class CardealBanhado implements Passaro { // --------------------------------------- atributos da classe private final String nome; private final String cor_topete; private final String cor_corpo; CardealBanhado(String nome, String cor_topete, String cor_corpo) { this.nome = nome; this.cor_topete = cor_topete; this.cor_corpo = cor_corpo; } @Override public void exibeNome() { System.out.println("Nome do Pássaro: " + nome); System.out.println("Número de Patas: " + numeroPatas); } @Override public void exibeCores() { System.out.println("Cor do Topete: " + cor_topete); System.out.println("Cor do Corpo: " + cor_corpo); } } 2.3.2 ProgInterface_2 // ---------------------------------------------------------------------------------------------- Programa Principal: ProgInterface_1.java package proginterface_2; public class ProgInterface_2 { public static void main(String[] args) { Homem homem = new Homem(); Mulher mulher = new Mulher(); homem.setDados("Paulo Roberto", 52, 'm'); mulher.setDados("Adriane Maria", 45, 'f'); System.out.println(homem); System.out.println(mulher); } } // ----------------------------------------------------------------------------------------------------------------------------- Interface: Pessoa.java package proginterface_2; public interface Pessoa { public abstract void setDados(String nome, int idade, char sexo); public abstract String toString(); } // ------------------------------------------------------------------------------------------------------------------------- Classe: Homem.java package proginterface_2; public class Homem implements Pessoa { private String nome; 224 private int idade; private char sexo; @Override public void setDados(String nome, int idade, char sexo) { setNome(nome); setIdade(idade); setSexo(sexo); } // ----------------------------------------- sobrecarga do método toString public String toString() { return("| Homem: " + nome + " | Idade: " + idade + " | Sexo: MASCULINO |"); } private void setNome(String nome) { this.nome = nome; } private void setIdade(int idade) { this.idade = idade; } private void setSexo(char sexo) { this.sexo = sexo; } } // -------------------------------------------------------------------------------------------------------------------- Classe: Mulher.java package proginterface_2; public class Mulher implements Pessoa { private String nome; private int idade; private char sexo; @Override public void setDados(String nome, int idade, char sexo) { setNome(nome); setIdade(idade); setSexo(sexo); } // ----------------------------------------- sobrecarga do método toString @Override public String toString() { return("| Mulher: " + nome + " | Idade: " + idade + " | Sexo: FEMININO |"); } private void setNome(String nome) { this.nome = nome; } private void setIdade(int idade) { this.idade = idade; } private void setSexo(char sexo) { this.sexo = sexo; } } 2.3.2 ProgInterface_3 225 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgInterface_1.java package proginterface_3; public class ProgInterface_3 { public static void main(String[] args) { Pessoa pessoa1 = new Pessoa(); Pessoa pessoa2 = new Pessoa(); pessoa1.set("Paulo Roberto"); pessoa1.set(52); pessoa1.set('m'); System.out.println("Pessoa1: " + pessoa1); pessoa2.set("Adriane Maria"); pessoa2.set(45); pessoa2.set('f'); System.out.println("Pessoa2: " + pessoa2); } } // -------------------------------------------------------------------------------------------------------------------------- Classe: Pessoa.java package proginterface_3; public class Pessoa { private String nome; private int idade; private char sexo; public void set(String nome) { this.nome = nome; } public void set(int idade) { this.idade = idade; } public void set(char sexo) { this.sexo = sexo; } // ------------------------------- sobrecarga do método toString @Override public String toString() { return("| Nome: " + nome + " | Idade: " + idade + " | Sexo: " + sexo + " |"); } } Anexo 3.4 Solução da Lista: Herança 3.4.1 Herança (Primeiro) // ----------------------------------------------------------------------------------------------------------------- Classe Base: Pessoa.java package progtestapessoa; public class Pessoa { protected String nome; protected String cpf; Pessoa() { this.nome = "xxxx"; this.cpf = "xxx.xxx.xxx-xx"; 226 } Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; } public void imprimePessoa() { System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); } } // ----------------------------------------------------------------------------------------------------------- Classe Derivada: Cliente.java package progtestapessoa; public class Cliente extends Pessoa { private double conta; Cliente(String nome, String cpf, double conta) { super(nome, cpf); this.conta = conta; } public void imprimeCliente() { System.out.println("Conta: " + conta); } } // ------------------------------------------------------------------------------------------------- Programa Principal: ProgTestaPessoa.java package progtestapessoa; public class ProgTestaHeranca { public static void main(String[] args) { Cliente cliente = new Cliente("Paulo Roberto", "123.456.789-09", 1234.56); cliente.imprimePessoa(); cliente.imprimeCliente(); } } 3.4.2 Herança (Segundo) // ---------------------------------------------------------------------------------------------------------------------- Classe Base: Pessoa.java package progtestahomem; public class Pessoa { protected double altura; protected char sexo; Pessoa() { this.altura = 0.0; this.sexo = 'g'; } Pessoa(double altura, char sexo) { this.altura = altura; this.sexo = sexo; } public void imprimePessoa() { 227 System.out.println("Altura: " + altura); System.out.println("Sexo: " + sexo); } } // -------------------------------------------------------------------------------------------------------------- Classe Derivada: Homem.java package progtestahomem; public class Homem extends Pessoa { // ------------------------------------------- atributos da classe private double pesoIdeal; // ---------------------------------------------------- construtor Homem(double altura, char sexo) { super(altura, sexo); } // ------------------------------------------------------------ métodos públicos da classe public void calculaPesoIdealHomem() { pesoIdeal = 72.7 * altura - 58.0; } public void imprimePesoIdealHomem() { System.out.printf("Peso Ideal (Homem): %.2f\n", pesoIdeal); } // ------------------------------- métodos privados da classe // ------------------------------- métodos estáticos da classe } // ------------------------------------------------------------------------------------------------------ Classe Derivada: Mulher.java package progtestahomem; public class Mulher extends Pessoa { // --------------------------------------- atributos da classe private double pesoIdeal; // ------------------------------------------------- construtor Mulher(double altura, char sexo) { super(altura, sexo); } // ------------------------------------------------------- métodos públicos da classe public void calculaPesoIdealMulher() { pesoIdeal = 62.1 * altura - 44.7; } public void imprimePesoIdealMulher() { System.out.printf("Peso Ideal (Mulher): %.2f\n", pesoIdeal); } // ------------------------------- métodos privados da classe // ------------------------------- métodos estáticos da classe } // --------------------------------------------------------------------------------------------- Programa Principal: ProgTestaHomem.java package progtestahomem; public class ProgTestaHomem { public static void main(String[] args) { Homem homem = new Homem(1.64, 'm'); Mulher mulher = new Mulher(1.59, 'f'); homem.calculaPesoIdealHomem(); 228 homem.imprimePessoa(); homem.imprimePesoIdealHomem(); mulher.calculaPesoIdealMulher(); mulher.imprimePessoa(); mulher.imprimePesoIdealMulher(); } } 3.4.3 Herança (Terceiro) // ------------------------------------------------------------------------------------------------------------------- Classe Base: Objeto.java package progtestaobjetos; public class Objeto { protected int x; protected int y; Objeto() { x = 0; y = 0; } Objeto(int x, int y) { this.x = x; this.y = y; } public void imprimeObjeto(String mensagem) { System.out.println(mensagem + " -> (" + x + "," + y + ")"); } } // --------------------------------------------------------------------------------------------------------- Classe Derivada: Linha.java package progtestaobjetos; public class Linha extends Objeto { private final Objeto p1; private final Objeto p2; Linha (int xi, int yi, int xf, int yf) { p1 = new Objeto(xi, yi); p2 = new Objeto(xf, yf); } public void imprimeLinha(String mensagem) { System.out.println(mensagem); System.out.println("x: " + p1.x + " | y: " + p1.y); p1.imprimeObjeto("p1"); System.out.println("x: " + p2.x + " | y: " + p2.y); p2.imprimeObjeto("p2"); } } // -------------------------------------------------------------------------------------------------- Classe Derivada: Retangulo.java package progtestaobjetos; public class Retangulo extends Objeto { private final Objeto p1; private final Objeto p2; private final Objeto p3; private final Objeto p4; Retangulo (int xi, int yi, int xf, int yf) { p1 = new Objeto(xi, yi); p2 = new Objeto(xf, yi); 229 p3 = new Objeto(xf, yf); p4 = new Objeto(xi, yf); } public void imprimeRetangulo(String mensagem) { System.out.println(mensagem); System.out.println("x: " + p1.x + " | y: " + p1.y); p1.imprimeObjeto("p1"); System.out.println("x: " + p2.x + " | y: " + p2.y); p2.imprimeObjeto("p2"); System.out.println("x: " + p3.x + " | y: " + p3.y); p3.imprimeObjeto("p3"); System.out.println("x: " + p4.x + " | y: " + p4.y); p4.imprimeObjeto("p4"); } } // ------------------------------------------------------------------------------------------- Programa Principal: ProgTestaObjetos.java package progtestaobjetos; public class ProgTestaObjetos { public static void main(String[] args) { Linha linha = new Linha(1, 2, 3, 4); Retangulo retangulo = new Retangulo(1, 2, 3, 4); linha.imprimeLinha("Linha"); retangulo.imprimeRetangulo("Retângulo"); } } Anexo 4.4 Solução da Lista: Entrada e Saída Bufferizada 4.4.1 ProgBuffer_1 // ---------------------------------------------------------------------------------------------- Programa Principal: ProgBuffer_1.java package progbuffer_1; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class ProgBuffer_1 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readLine(); String[] partes = text.split(" "); int n = partes.length; out.write("Quantidade de Valores Digitados: " + n); out.newLine(); int soma = 0; int maior = 0, menor = 9999; for (int i = 0; i < n; i++) { int t = Integer.parseInt(partes[i]); soma = soma + t; if (t > maior) { maior = t; } if (t < menor) { menor = t; } 230 } double media = (double) soma / n; out.write("Média: " + media); out.newLine(); out.write("Maior: " + maior); out.newLine(); out.write("Menor: " + menor); out.newLine(); out.flush(); } } 4.4.2 ProgBuffer_2 // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgBuffer_2.java package progbuffer_2; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; public class ProgBuffer_2 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readLine(); int n = Integer.parseInt(text); int[] vetor = new int[n]; text = in.readLine(); String[] partes = text.split(" "); int max = partes.length; if (max == n) { for (int i = 0; i < n; i++) { vetor[i] = Integer.parseInt(partes[i]); } Arrays.sort(vetor); for (int i = 0; i < n; i++) { out.write(vetor[i] + " "); } } else { out.write("Erro na Entrada dos valores"); } out.newLine(); out.flush(); } } 231 Anexo 5.6.1 Solução da Lista: Vector, ArrayList e LinkedList 5.6.1.1 ProgVector_1 // ----------------------------------------------------------------------------------------- Programa Principal: ProgVector_1.java package progvector_1; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_1 { public static void main(String[] args) { ArrayList letras = new ArrayList(); ArrayList inverso = new ArrayList(); Scanner input = new Scanner(System.in); char letra; do { System.out.print("Letra: "); String s = input.nextLine(); letra = s.charAt(0); if (letra != 'F' && letra != 'f') { letras.add(letra); } } while (letra != 'F' && letra != 'f'); int n = letras.size(); int u = n - 1; for (int i = u;i >= 0;i--) { inverso.add(letras.get(i)); } System.out.println(letras); System.out.println(inverso); } } 5.6.1.2 ProgVector_2 // ---------------------------------------------------------------------------------------------------- Programa Base: ProgVector_2.java package progvector_2; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_2 { public static void main(String[] args) { ArrayList <Integer> idade = new ArrayList(); Scanner input = new Scanner(System.in); System.out.print("Número de Idades: "); String s = input.nextLine(); int n = Integer.parseInt(s); int u = n - 1; for (int i = 0; i <= u; i++) { System.out.print("Idade: "); s = input.nextLine(); int leIdade = Integer.parseInt(s); idade.add(leIdade); } char ch; do { int antes = 0; System.out.print("Idade para Consulta: "); s = input.nextLine(); 232 int idadeConsulta = Integer.parseInt(s); // antes = idades.indexOf(idadeConsulta); for (int i = 0; i < n; i++) { if (idade.get(i) != idadeConsulta) { antes++; } else { break; } } System.out.println("Antes: " + antes); int depois = n - antes - 1; System.out.println("Depois: " + depois); do { System.out.print("Continua [S/N]? "); s = input.nextLine(); ch = s.charAt(0); } while (!strChr("SsNn", ch)); } while (strChr("Ss", ch)); // Sugestão do Discente: Afrânio Peres da Fonseca } // ------------------------------------------ método estático: strChr static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } } 5.6.1.3 ProgVector_3 // ---------------------------------------------------------------------------------------------------------- Programa Base: ProgVector_3.java package progvector_3; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_3 { public static void main(String[] args) { ArrayList <Integer> numeros = new ArrayList(); Scanner input = new Scanner(System.in); int leNumero, valor; do { System.out.print("Número: "); String s = input.nextLine(); leNumero = Integer.parseInt(s); if (leNumero != 0) { numeros.add(leNumero); } } while (leNumero != 0); int n = numeros.size(); int u = n – 1; do { System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); /* int posicao = numeros.indexOf(valor); if (posicao == -1) { System.out.println("ERRO: Número não encontrado"); } else { System.out.println("Posição: " + posicao); 233 } */ boolean encontrou = false; if (valor != 0) { for (int i = 0; i <= u; i++) { if (numeros.get(i) == valor) { System.out.println("Posição no Vetor: " + i); encontrou = true; break; } } if (!encontrou) { System.out.println("Erro: Número não encontrado"); } } } while (valor != 0); } } 5.6.1.4 ProgVector_4 // -------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_4.java package progvector_4; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_4 { public static void main(String[] args) { ArrayList <Character> conceito = new ArrayList(); Scanner input = new Scanner(System.in); char ch; do { System.out.print("Conceito: "); String s = input.nextLine(); ch = s.charAt(0); if (!strChr("Ff", ch)) { if (strChr("AaBbCcDdEe", ch)) { conceito.add(ch); } } } while (!strChr("Ff", ch)); int aprovados = 0, reprovados = 0, infrequentes = 0; int n = conceito.size(); for (int i = 0; i < n; i++) { if (strChr("AaBbCc", conceitos.get(i))) { aprovados++; } else { if (strChr("Dd", conceitos.get(i))) { reprovados++; } else { infrequentes++; } } } System.out.println(aprovados + " aprovado(s)"); System.out.println(reprovados + " reprovado(s)"); System.out.println(infrequentes + " infrequente(s)"); } // ------------------------------------------ método estático: strChr static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { 234 return (true); } } return (false); } } 5.6.1.5 ProgVector_5 // ---------------------------------------------------------------------------------------------- Programa Prinicpal: ProgVector_5.java package progvector_5; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_5 { public static void main(String[] args) { ArrayList nomes = new ArrayList(); Scanner input = new Scanner(System.in); String s; char letra; do { System.out.print("Nome: "); s = input.nextLine(); if (!s.equals("")) { nomes.add(s); } } while (!s.equals("")); int n = nomes.size(); do { System.out.print("Letra: "); s = input.nextLine(); if (s.equals("")) { System.exit(0); } letra = s.charAt(0); for (int i = 0; i < n; i++) { if (nomes.get(i).toString().charAt(0) == letra) { System.out.println("Nome: " + nomes.get(i).toString()); } } } while (!s.equals("")); System.out.println("Nomes: " + nomes.toString()); } } 5.6.1.6 ProgVector_6 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_6.java package progvector_6; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_6 { public static void main(String[] args) { ArrayList <String> nome = new ArrayList<>(); ArrayList <Integer> idade = new ArrayList(); Scanner input = new Scanner(System.in); String s; char ch; do { 235 System.out.print("Nome: "); s = input.nextLine(); nome.add(s); System.out.print("Idade: "); s = input.nextLine(); int idadeDigitada = Integer.parseInt(s); idade.add(idadeDigitada); do { System.out.print("Continua [S/N]? "); s = input.nextLine(); ch = s.charAt(0); } while (!strChr("SsNn", ch)); } while (strChr("Ss", ch)); Object [] nomes = nome.toArray(); Object [] idades = idade.toArray(); int n = nome.size(); int u = n - 1; for (int i = 0; i < u; i++) { for (int j = i+1; j <= u; j++) { if (idades[i].hashCode() < idades[j].hashCode()) { Object temp = nomes[i]; nomes[i] = nomes[j]; nomes[j] = temp; Object t = idades[i]; idades[i] = idades[j]; idades[j] = t; } } } for (int i = 0; i <= u; i++) { System.out.printf("%-10s %d\n", nomes[i], idades[i]); } } // ------------------------------------------------------------------------------- strChr // Testa se um caracter está presente dentro da string public static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } } 5.6.1.7 ProgVector_7 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_7.java package progvector_7; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class ProgVector_7 { public static void main(String[] args) { ArrayList nome = new ArrayList(); Scanner input = new Scanner(System.in); String s; do { System.out.print("Nome: "); s = input.nextLine(); if (!s.equals("")) { 236 nome.add(s); } } while (!s.equals("")); Object [] vetor = nome.toArray(); Arrays.sort(vetor); System.out.println(Arrays.toString(vetor)); } } 5.6.1.8 ProgVector_8 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_8.java package progvector_8; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class ProgVector_8 { public static void main(String[] args) { ArrayList <Integer> idade = new ArrayList(); Scanner input = new Scanner(System.in); int leIdade; do { System.out.print("Idade: "); String s = input.nextLine(); leIdade = Integer.parseInt(s); if (leIdade != 0) { idade.add(leIdade); } } while (leIdade != 0); Object [] idades = idade.toArray(); Arrays.sort(idades); System.out.print("Idades Ordenadas: "); int n = idades.length; double soma = 0.0; for (int i = 0; i < n; i++) { System.out.print(idades[i] + " "); soma = soma + idades[i].hashCode(); } System.out.println("\nMaior Idade: " + idades[n-1]); System.out.println("Menor Idade: " + idades[0]); double media = soma / n; System.out.println("Média: " + media); } } 5.6.1.9 ProgVector_9 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgVector_9.java package progvector_9; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class ProgVector_9 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readLine(); 237 String [] partes_1 = text.split(" "); int n1 = partes_1.length; for (int i = 0;i < n1;i++) { int t = Integer.parseInt(partes_1[i]); } text = in.readLine(); String [] partes_2 = text.split(" "); int n2 = partes_2.length; for (int i = 0;i < n2;i++) { int t = Integer.parseInt(partes_2[i]); } int pontos = 0; for (int i = 0; i < n2; i++) { for (int j = 0; j < n1; j++) { if (partes_2[i].equals(partes_1[j])) { pontos++; } } } out.write(pontos + " ponto(s)"); out.newLine(); out.flush(); } } 5.6.1.10 ProgVector_10 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_10.java package progvector_10; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class ProgVector_10 { public static void main(String[] args) { ArrayList megaSena = new ArrayList(); Scanner input = new Scanner(System.in); int numeroPalpites; do { System.out.print("Número de Palpites para a MegaSena: "); String s = input.nextLine(); numeroPalpites = Integer.parseInt(s); } while (numeroPalpites < 0); for (int i = 1; i <= numeroPalpites; i++) { int numeroAleatorio = 1 + (int) (Math.random() * 100); megaSena.add(numeroAleatorio); for (int j = 1; j <= 5; j++) { numeroAleatorio = 1 + (int) (Math.random() * 100); if (!testaRepetido(megaSena, numeroAleatorio)) { megaSena.add(numeroAleatorio); } } Object[] temp = megaSena.toArray(); Arrays.sort(temp); megaSena.removeAll(megaSena); int n = temp.length; for (int k = 0; k < n; k++) { megaSena.add(temp[k]); } System.out.println("Palpite para MegaSena é " + megaSena.toString()); megaSena.removeAll(megaSena); } } 238 static boolean testaRepetido(ArrayList megaSena, int valor) { int n = megaSena.size(); for (int i = 0; i < n; i++) { if (megaSena.get(i).hashCode() == valor) { return(true); } } return (false); } } 5.6.1.11 ProgVector_11 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_11.java package progvector_11; import java.util.LinkedList; import java.util.Scanner; public class ProgVector_11 { public static void main(String[] args) { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado; Object valor; do { do { System.out.print("[I]ncluir, [C]onsultar, [R]emover ou [F]im: "); String s = input.nextLine(); opcao = s.charAt(0); } while (!strChr("IiCcRrFf", opcao)); if (strChr("Ff", opcao)) { System.exit(0); } do { System.out.print("[E]squerda ou [D]ireita "); String s = input.nextLine(); lado = s.charAt(0); } while (!strChr("EeDd", lado)); switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextLine(); int dado = Integer.parseInt(s); if (dado != 0) { switch (lado) { case 'E': case 'e': lista.addFirst(dado); break; case 'D': case 'd': lista.addLast(dado); break; } } break; case 'C': case 'c': switch (lado) { case 'E': case 'e': valor = lista.getFirst(); 239 System.out.println("Dado Consultado: " + valor); break; case 'D': case 'd': valor = lista.getLast(); System.out.println("Dado Consultado: " + valor); break; } break; case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isEmpty()) { valor = lista.removeFirst(); System.out.println("Dado Removido à esquerda: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; case 'D': case 'd': if (!lista.isEmpty()) { valor = lista.removeLast(); System.out.println("Dado Removido à Direita: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; } break; } System.out.println("LinkedList: " + lista); } while (true); } static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 5.6.1.12 ProgVector_12 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgVector_12.java package progvector_12; import java.util.LinkedList; import java.util.Scanner; public class ProgVector_12 { public static void main(String[] args) { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado; Object valor; int posicao; do { do { 240 System.out.print("[I]ncluir, [C]onsultar, [R]emover ou [F]im: "); String s = input.nextLine(); opcao = s.charAt(0); } while (!strChr("IiCcRrFf", opcao)); if (strChr("Ff", opcao)) { System.exit(0); } do { System.out.print("[E]squerda, [P]osição [D]ireita: "); String s = input.nextLine(); lado = s.charAt(0); } while (!strChr("EePpDd", lado)); switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextLine(); int dado = Integer.parseInt(s); if (dado != 0) { switch (lado) { case 'E': case 'e': lista.addFirst(dado); break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); int n = lista.size(); if (posicao >= 0 && posicao < n) { lista.add(posicao, dado); } else { System.out.println("ERRO: Posição Inválida"); } break; case 'D': case 'd': lista.addLast(dado); break; } } break; case 'C': case 'c': switch (lado) { case 'E': case 'e': valor = lista.getFirst(); System.out.println("Dado Consultado: " + valor); break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); int n = lista.size(); if (posicao >= 0 && posicao < n) { valor = lista.get(posicao); System.out.println("Dado Consultado: " + valor); } else { System.out.println("ERRO: Posição Inválida"); } break; case 'D': case 'd': valor = lista.getLast(); 241 System.out.println("Dado Consultado: " + valor); break; } break; case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isEmpty()) { valor = lista.removeFirst(); System.out.println("Dado Removido à esquerda: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; case 'P': case 'p': System.out.print("Posição: "); s = input.nextLine(); posicao = Integer.parseInt(s); int n = lista.size(); if (posicao >= 0 && posicao < n) { valor = lista.remove(posicao); System.out.println("Dado Removido da Posição: " + valor); } else { System.out.println("ERRO: Posição Inválida"); } break; case 'D': case 'd': if (!lista.isEmpty()) { valor = lista.removeLast(); System.out.println("Dado Removido à Direita: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; } break; } System.out.println("LinkedList: " + lista); } while (true); } // ------------------------------------------------------- método estático static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 5.6.1.13 ProgVector_13 // -------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_13.java package progvector_13; import java.util.LinkedList; import java.util.Scanner; public class ProgVector_13 { 242 public static void main(String[] args) { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado = 'E'; Object valor; do { do { System.out.print("[I]ncluir, [E]lemento, [R]emover ou [F]im: "); String s = input.nextLine(); opcao = s.charAt(0); } while (!strChr("IiEeRrFf", opcao)); if (strChr("Ff", opcao)) { System.exit(0); } if (strChr("IiRr", opcao)) { do { System.out.print("[E]squerda ou [D]ireita "); String s = input.nextLine(); lado = s.charAt(0); } while (!strChr("EeDd", lado)); } switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextLine(); int dado = Integer.parseInt(s); if (dado != 0) { switch (lado) { case 'E': case 'e': lista.addFirst(dado); break; case 'D': case 'd': lista.addLast(dado); break; } } break; case 'E': case 'e': System.out.print("Elemento a Pesquisar: "); s = input.nextLine(); int elemento = Integer.parseInt(s); int indice = lista.indexOf(elemento); if (indice - 1 >= 0) { System.out.println("Antecessor: " + lista.get(indice - 1)); } else { System.out.println("ERRO: SEM ANTECESSOR"); } if (indice + 1 < lista.size()) { System.out.println("Sucessor: " + lista.get(indice + 1)); } else { System.out.println("ERRO: SEM SUCESSOR"); } break; case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isEmpty()) { valor = lista.removeFirst(); System.out.println("Dado Removido à esquerda: " + valor); } else { System.out.println("ERRO: Lista Vazia"); 243 } break; case 'D': case 'd': if (!lista.isEmpty()) { valor = lista.removeLast(); System.out.println("Dado Removido à Direita: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; } break; } System.out.println("LinkedList: " + lista); } while (true); } static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 5.6.1.14 ProgVector_14 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_14.java package progvector_14; import java.util.LinkedList; import java.util.Scanner; public class ProgVector_14 { public static void main(String[] args) { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado = 'E'; Object valor; do { do { System.out.print("[I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: "); String s = input.nextLine(); opcao = s.charAt(0); } while (!strChr("IiEeRrPpFf", opcao)); if (strChr("Ff", opcao)) { System.exit(0); } if (strChr("IiRr", opcao)) { do { System.out.print("[E]squerda ou [D]ireita: "); String s = input.nextLine(); lado = s.charAt(0); } while (!strChr("EeDd", lado)); } switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextLine(); int dado = Integer.parseInt(s); 244 if (dado != 0) { switch (lado) { case 'E': case 'e': lista.addFirst(dado); break; case 'D': case 'd': lista.addLast(dado); break; } } break; case 'E': case 'e': System.out.print("Elemento a Pesquisar: "); s = input.nextLine(); int elemento = Integer.parseInt(s); int indice = lista.indexOf(elemento); if (indice - 1 >= 0) { System.out.println("Antecessor: " + lista.get(indice - 1)); } else { System.out.println("ERRO: SEM ANTECESSOR"); } if (indice + 1 < lista.size()) { System.out.println("Sucessor: " + lista.get(indice + 1)); } else { System.out.println("ERRO: SEM SUCESSOR"); } break; case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isEmpty()) { valor = lista.removeFirst(); System.out.println("Dado Removido à esquerda: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; case 'D': case 'd': if (!lista.isEmpty()) { valor = lista.removeLast(); System.out.println("Dado Removido à Direita: " + valor); } else { System.out.println("ERRO: Lista Vazia"); } break; } break; case 'P': case 'p': System.out.print("Indice: "); s = input.nextLine(); indice = Integer.parseInt(s); if (indice >= 0 && indice < lista.size()) { valor = lista.get(indice); System.out.println("Dado Pesquisado pelo Indice: " + valor); } else { System.out.println("ERRO: Indice Inexistente"); } break; } System.out.print(" Indices: "); for (int i = 0; i < lista.size(); i++) { 245 System.out.printf("%3d ", i); } System.out.println("\nLinkedList: " + lista); } while (true); } static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 5.6.1.15 ProgVector_15 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgVector_15.java package progvector_15; import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner; public class ProgVector_15 { public static void main(String[] args) { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado = 'E'; Object valor; do { do { System.out.print("[I]ncluir, [S]ort, [C]lear All ou [F]im: "); String s = input.nextLine(); opcao = s.charAt(0); } while (!strChr("IiSsCcFf", opcao)); if (strChr("Ff", opcao)) { System.exit(0); } if (strChr("Ii", opcao)) { do { System.out.print("[E]squerda ou [D]ireita: "); String s = input.nextLine(); lado = s.charAt(0); } while (!strChr("EeDd", lado)); } switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextLine(); int dado = Integer.parseInt(s); if (dado != 0) { switch (lado) { case 'E': case 'e': lista.addFirst(dado); break; case 'D': case 'd': lista.addLast(dado); break; } 246 } break; case 'S': case 's': Object[] objetos = lista.toArray(); Arrays.sort(objetos); lista.clear(); for (int i = 0; i < objetos.length; i++) { lista.add(objetos[i]); } break; case 'C': case 'c': lista.clear(); break; } System.out.print(" Indices: "); for (int i = 0; i < lista.size(); i++) { System.out.printf("%3d ", i); } System.out.println("\nLinkedList: " + lista); } while (true); } // ------------------------------------------------------- método estático static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 5.6.1.16 ProgVector_16 // ----------------------------------------------------------------------------------------------- Programa Principal: ProgVector_16.java package progvector_16; import java.util.ArrayList; import java.util.Scanner; public class ProgVector_16 { public static void main(String[] args) { ArrayList<Integer> array = new ArrayList(); Scanner input = new Scanner(System.in); Integer info = 999; do { System.out.print("Info: "); String s = input.nextLine(); if (!s.equals("")) { if (info == 999) { array.add(Integer.parseInt(s)); info++; } else { info = Integer.parseInt(s); if (info != 0) { int posicao = verificaPosicao(array, info); if (posicao != -1) { array.add(posicao, info); } else { System.out.println("ERRO: Informação Repetida"); } 247 } } } System.out.println("ArrayList: " + array); } while (info != 0); } // ------------------------------------------------------- método estático public static int verificaPosicao(ArrayList array, Integer info) { int posicao = -1; int n = array.size(); for (int i = 0; i < n; i++) { if (info == array.get(i).hashCode()) { // elimina informação repetida return (-1); } if (info < array.get(i).hashCode()) { // localiza posição da informação menor return (i); } if (info > array.get(i).hashCode()) { // localiza posição da informação maior posicao = i + 1; } } return (posicao); } } 248 Anexo 5.8.2 Solução da Lista: Strings 5.8.2.1 ProgString_1 // ----------------------------------------------------------------------------------------------- Programa Principal: ProgString_1.java package progstring_1; import java.util.Scanner; public class ProgString_1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); int vogais = 0, consoantes, espacos = 0; int maiusculas = 0, minusculas; System.out.print("Nome: "); String nome = input.nextLine(); int totalLetras = nome.length(); for (int i = 0;i < totalLetras;i++) { if ("AaEeIiOoUu".indexOf(nome.charAt(i)) != -1) { vogais++; } if (nome.charAt(i) == 32) { // 32 é o ' ' (espaço em branco) espacos++; } if (nome.charAt(i) >= 'A' && nome.charAt(i) <= 'Z') { maiusculas++; } } System.out.printf("(%d) Vogal(is)\n", vogais); consoantes = totalLetras - vogais - espacos; System.out.printf("(%d) Consoante(s)\n", consoantes); System.out.printf("(%d) Maúscula(s)\n", maiusculas); minusculas = totalLetras - maiusculas - espacos; System.out.printf("(%d) Minúscula(s)\n", minusculas); } } 5.8.2.2 ProgString_2 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgString_2.java package progstring_2; import java.util.Scanner; public class ProgString_2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); char digito; do { int contaLetras = 0; System.out.print("Palavra: "); String palavra = input.nextLine(); System.out.print("Letra: "); String s = input.nextLine(); char letra = s.charAt(0); int n = palavra.length(); for (int i = 0; i < n; i++) { if (palavra.charAt(i) == letra) { contaLetras++; } 249 } if (contaLetras == 0) { System.out.println("ERRO: Não existe a letra " + letra + " na palavra (" + palavra + ")"); } else { System.out.println(contaLetras + " letra(s)"); } do { System.out.print("Continua [S]im ou [N]ão? "); s = input.nextLine(); digito = s.charAt(0); } while ("SsNn".indexOf(digito) == -1); } while ("Ss".indexOf(digito) != -1); } } 5.8.2.3 ProgString_3 // -------------------------------------------------------------------------------------------------- Programa Principal: ProgString_3.java package progstring_3; import java.util.Scanner; public class ProgString_3 { public static void main(String[] args) { Scanner input = new Scanner(System.in); char antecessora = 'X', sucessora = 'Y'; System.out.print("Palavra: "); String palavra = input.nextLine(); System.out.print("Posição: "); String s = input.nextLine(); int posicao = Integer.parseInt(s); int n = palavra.length(); if (posicao < 0 || posicao > n) { System.out.println("Erro: Posição Inválida"); } else { if (posicao == 0) { System.out.println("Erro: Sem Antecessora"); } else { antecessora = palavra.charAt(posicao - 1); } if (posicao == n - 1) { System.out.println("Erro: Sem Sucessora"); } else { sucessora = palavra.charAt(posicao + 1); } System.out.println("Antecessora: " + antecessora); System.out.println("Letra: " + palavra.charAt(posicao)); System.out.println("Sucessora: " + sucessora); } } } 5.8.2.4 ProgString_4 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgString_4.java package progstring_4; import java.util.Scanner; public class ProgString_4 { public static void main(String[] args) { Scanner input = new Scanner(System.in); 250 System.out.print("Nome: "); String nome = input.nextLine(); String [] partes = nome.split(" "); int n = partes.length; // número de palavras da String int u = n - 1; // último elemento da String for (int i = u;i >= 0;i--) { System.out.println(partes[i]); } } } 5.8.2.5 ProgString_5 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgString_5.java package progstring_5; import java.util.Scanner; public class ProgString_5 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextLine(); String[] partes = nome.split(" "); int n = partes.length; int u = n - 1; System.out.println(partes[u].toUpperCase()); } } 5.8.2.6 ProgString_6 // ------------------------------------------------------------------------------------------------ Programa Principal: ProgString_6.java package progstring_6; import java.util.Scanner; public class ProgString_6 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextLine(); nome = corrigeNome(nome); System.out.println("Nome corrigido: " + nome); String[] partes = nome.split(" "); int n = partes.length; System.out.print(partes[n - 1] + ", " + partes[0] + " "); for (int i = 1;i < n-1;i++) { System.out.print(partes[i].charAt(0) + ". "); } System.out.println(); } static String corrigeNome(String nome) { nome = nome.toLowerCase(); int n = nome.length(); String temp = ""; temp = temp + Character.toUpperCase(nome.charAt(0)); for (int i = 1; i < n; i++) { if (nome.charAt(i) == 32) { 251 temp = temp + " " + Character.toUpperCase(nome.charAt(i + 1)); i++; } else { temp = temp + nome.charAt(i); } } return (temp); } } 5.8.2.7 ProgString_7 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgString_7.java package progstring_7; import java.util.Scanner; public class ProgString_7 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Estado: "); String estado = input.nextLine(); estado = converteString(estado); System.out.println("Estado corrigido: " + estado); String [] partes = estado.split(" "); int n = partes.length; if (n >= 2) { System.out.println("Sigla: " + partes[0].charAt(0) + partes[n-1].charAt(0)); } } static String converteString(String s) { String temp = ""; s = s.toLowerCase(); temp = temp + Character.toUpperCase(s.charAt(0)); int n = s.length(); for (int i = 1;i < n;i++) { if (s.charAt(i) == 32) { temp = temp + " " + Character.toUpperCase(s.charAt(i+1)); i++; } else { temp = temp + s.charAt(i); } } return(temp); } } 5.8.2.8 ProgString_8 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgString_8.java package progstring_8; import java.util.Scanner; public class ProgString_8 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Palavra: "); String palavra = input.nextLine(); int n = palavra.length(); 252 System.out.print("Início: "); String s = input.nextLine(); int inicio = Integer.parseInt(s); if (inicio < 0) { System.out.println("ERRO: Início Inválido"); System.exit(0); } System.out.print("Fim: "); s = input.nextLine(); int fim = Integer.parseInt(s); if (fim >= n) { System.out.println("ERRO: Fim Inválido"); System.exit(0); } if (fim < inicio) { int temp = inicio; inicio = fim; fim = temp; } for (int i = inicio;i <= fim;i++) { System.out.print(palavra.charAt(i)); } System.out.println(); } } Anexo 6.4 Solução da Lista: Listas Lineares 6.4.1 ProgLista_1 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_1.java package proglista_1; import java.util.Scanner; import java.util.Stack; public class ProgLista_1 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); String s; do { System.out.print("Nome: "); s = input.nextLine(); } while (s.equals("")); String [] partes = s.split(" "); int n = partes.length; for (int i = 0;i < n;i++) { pilha.push(partes[i].charAt(0)); } int totalLetras = 0; System.out.print("Abreviatura: "); do { Character letra = (Character) pilha.pop(); System.out.print(letra); totalLetras++; } while (!pilha.empty()); System.out.println(); System.out.println("Pilha: " + pilha.toString()); System.out.println("Total de Letras: " + totalLetras); // cast } } 253 6.4.2 ProgLista_2 // ------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_2.java package proglista_2; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgLista_2 { public static void main(String[] args) { Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); int espacos = 0; String s; do { System.out.print("Nome: "); s = input.nextLine(); } while (s.equals("")); int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) != 32) { fila.offer(s.charAt(i)); // insere na Fila } else { espacos++; } } System.out.print("Nome Modificado: "); do { Character letra = (Character) fila.poll(); // remove da fila - cast System.out.print(letra); } while (!fila.isEmpty()); System.out.println(); System.out.println("Número de Espaços Eliminados: " + espacos); } } 6.4.3 ProgLista_3 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_3.java package proglista_3; import java.util.Scanner; import java.util.Stack; public class ProgLista_3 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); String nome; int homens = 0, mulheres = 0, indeterminados = 0; do { System.out.print("Nome: "); nome = input.nextLine(); if (nome.compareTo("") != 0) { int n = nome.length(); int u = n - 1; switch (nome.charAt(u)) { case 'A': case 'a': pilha.push('f'); 254 mulheres++; break; case 'O': case 'o': pilha.push('m'); homens++; break; default: pilha.push('i'); indeterminados++; } } } while (nome.compareTo("") != 0); System.out.println("Pilha: " + pilha.toString()); System.out.println(homens + " homens"); System.out.println(mulheres + " mulheres"); System.out.println(indeterminados + " indeterminados"); } } 6.4.4 ProgLista_4 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_4.java package proglista_4; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgLista_4 { public static void main(String[] args) { Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); String nome; do { System.out.print("Nome: "); nome = input.nextLine(); if (!nome.equals("")) { fila.offer(nome); } } while (!nome.equals("")); Object [] temp = fila.toArray(); Arrays.sort(temp); System.out.println("Fila: " + Arrays.toString(temp)); } } 6.4.5 ProgLista_5 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgLista_5.java package proglista_5; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgLista_5 { public static void main(String[] args) { Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); Integer valor, quantidade; 255 do { System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { System.out.print("Quantidade: "); s = input.nextLine(); quantidade = Integer.parseInt(s); fila.offer(valor); fila.offer(quantidade); } } while (valor != 0); int totalImpresso = 0; System.out.println("Fila: " + fila.toString()); do { valor = (Integer) fila.poll(); // cast quantidade = (Integer) fila.poll(); // cast for (int i = 1;i <= quantidade;i++) { System.out.print(valor + " "); totalImpresso++; } } while (!fila.isEmpty()); System.out.println(); System.out.println("Total de Valores Impressos: " + totalImpresso); } } 6.4.6 ProgLista_6 // ------------------------------------------------------------------------------------------------ Programa Principal: ProgLista_6.java package proglista_6; import java.util.Scanner; import java.util.Stack; public class ProgLista_6 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); String nome; do { System.out.print("Nome: "); nome = input.nextLine(); if (!nome.equals("")) { int n = nome.length(); pilha.push(n); } } while (!nome.equals("")); System.out.println("Pilha: " + pilha.toString()); if (!pilha.isEmpty()) { int i = 0; int totalCaracteres = 0, totalNomes = 0; do { Integer tamanho = (Integer) pilha.pop(); totalCaracteres = totalCaracteres + tamanho; totalNomes++; } while (!pilha.empty()); System.out.println("Total de Caracteres: " + totalCaracteres + " letra(s)"); System.out.println("Total de Nomes: " + totalNomes); System.out.println("Pilha: " + pilha.toString()); } } } 256 6.4.7 ProgLista_7 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_7.java package proglista_7; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; import java.util.Stack; public class ProgLista_7 { public static void main(String[] args) { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextLine(); int n = nome.length(); for (int i = 0; i < n; i++) { if (strChr("AaEeIiOoUu", nome.charAt(i))) { pilha.push(nome.charAt(i)); } else { if (nome.charAt(i) != 32) { fila.offer(nome.charAt(i)); } } } System.out.println("Fila: " + fila.toString()); System.out.println("Pilha: " + pilha.toString()); } static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charAt(i) == ch) { return (true); } } return (false); } } 6.4.8 ProgLista_8 // ------------------------------------------------------------------------------------------- Programa Principal: ProgLista_8.java package proglista_8; import java.util.Scanner; import java.util.Stack; public class Lista_8 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextLine(); int n = nome.length(); for (int i = 0;i < n;i++) { pilha.push(nome.charAt(i)); } System.out.print("Nome Invertido: "); 257 do { Character letra = (Character) pilha.pop(); System.out.printf("%c", letra); } while (!pilha.empty()); System.out.println(); } } 6.4.9 ProgLista_9 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_9.java package proglista_9; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; import java.util.Stack; public class ProgLista_9 { public static void main(String[] args) { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextLine(); int n = nome.length(); for (int i = 0;i < n;i++) { if (strChr("AaEeIiOoUu", nome.charAt(i))) { pilha.push(nome.charAt(i)); } else { if (nome.charAt(i) != 32) { fila.offer(nome.charAt(i)); } } } System.out.println("Fila: " + fila.toString()); int consoantes = 0; do { fila.poll(); consoantes++; } while (!fila.isEmpty()); System.out.println("Total de Consoantes: " + consoantes); System.out.println("Fila: " + fila.toString()); System.out.println("Pilha: " + pilha.toString()); int vogais = 0; do { pilha.pop(); vogais++; } while (!pilha.empty()); System.out.println("Total de Vogais: " + vogais); System.out.println("Pilha: " + pilha.toString()); System.out.println("Total de Letras: " + (consoantes + vogais)); } static boolean strChr(String s, char ch) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charAt(i) == ch) { return(true); } } return(false); } } 258 6.4.10 ProgLista_10 // -------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_10.java package proglista_10; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; import java.util.Stack; public class ProgLista_10 { public static void main(String[] args) { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextLine(); String [] partes = nome.split(" "); int n = partes.length; for (int i = 0;i < n;i++) { fila.offer(partes[i]); pilha.push(partes[i].charAt(0)); } System.out.println("Fila: " + fila.toString()); System.out.println("Pilha: " + pilha.toString()); } } 6.4.11 ProgLista_11 // ------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_11.java package proglista_11; import java.util.Arrays; import java.util.Scanner; import java.util.Stack; public class ProgLista_11 { public static void main(String[] args) { Stack p1 = new Stack(); Stack p2 = new Stack(); Scanner input = new Scanner(System.in); int valor; do { System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { p1.push(valor); p2.push(valor * 2); } } while (valor != 0); System.out.println("p1: " + p1.toString()); System.out.println("p2: " + p2.toString()); int n = p1.size(); Integer [] vetor = new Integer[n * 2]; int i; for (i = 0;i < n;i++) { vetor[i] = (Integer) p1.pop(); } int j; for (j = i;j < n * 2;j++) { 259 vetor[j] = (Integer) p2.pop(); } Arrays.sort(vetor); System.out.print("Pilhas: "); for (i = 0;i < n*2;i++) { System.out.print(vetor[i] + " "); } System.out.println(); } } 6.4.12 ProgLista_12 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_12.java package proglista_12; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgLista_12 { public static void main(String[] args) { Queue f1 = new LinkedList(); Queue f2 = new LinkedList(); Scanner input = new Scanner(System.in); int maior = 0, menor = 999; Integer valor; do { System.out.print("Valor: "); String s = input.nextLine(); valor = Integer.parseInt(s); if (valor != 0) { f1.offer(valor); if (valor > maior) { maior = valor; } if (valor < menor) { menor = valor; } } } while (valor != 0); do { valor = (Integer) f1.poll() * 3; f2.offer(valor); if (valor > maior) { maior = valor; } if (valor < menor) { menor = valor; } } while (!f1.isEmpty()); System.out.println("f1: " + f1.toString()); System.out.println("f2: " + f2.toString()); System.out.println("Maior: " + maior); System.out.println("Menor: " + menor); } } 6.4.13 ProgLista_13 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_13.java package proglista_13; 260 import java.util.Scanner; import java.util.Stack; public class ProgLista_13 { public static void main(String[] args) { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); System.out.print("Palavra: "); String palavra = input.nextLine(); int n = palavra.length(); for (int i = 0;i < n;i++) { pilha.push(palavra.charAt(i)); } int totalLetras = 0; System.out.print("Palavra Invertida: "); do { Character letra = (Character) pilha.pop(); System.out.print(letra); totalLetras++; } while (!pilha.empty()); System.out.println(); System.out.println("Total de Letras: " + totalLetras); } } 6.4.14 ProgLista_14 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_14.java package proglista_14; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class ProgLista_14 { public static void main(String[] args) { Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); do { System.out.print("Valor Inicial: "); String s = input.nextLine(); int valorInicial = Integer.parseInt(s); if (valorInicial == 0) { System.exit(0); } System.out.print("Valor Final: "); s = input.nextLine(); int valorFinal = Integer.parseInt(s); System.out.print("Intervalo: "); s = input.nextLine(); int intervalo = Integer.parseInt(s); if (valorInicial < valorFinal) { for (int i = valorInicial; i <= valorFinal; i = i + intervalo) { fila.offer(i); } } else { for (int i = valorInicial; i >= valorFinal; i = i - intervalo) { fila.offer(i); } } System.out.println("Fila: " + fila.toString()); } while (true); } 261 } 6.4.15 ProgLista_15 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgLista_15.java package proglista_15; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; import java.util.Stack; public class ProgLista_15 { public static void main(String[] args) { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); Integer nodo = 0; do { System.out.print("Nodo: "); String s = input.nextLine(); if (!s.equals("")) { nodo = Integer.parseInt(s); if (nodo != 0) { pilha.push(nodo); fila.offer(nodo * 2); } } } while (nodo != 0); int n = pilha.size(); if (n > 0) { System.out.println("Pilha: " + pilha); System.out.println("Topo da Pilha: " + pilha.lastElement()); System.out.println("Base da Pilha: " + pilha.firstElement()); System.out.println("Número de Elementos da Pilha: " + pilha.size()); System.out.println("\nFila: " + fila); System.out.println("Primeiro Elemento da Fila: " + fila.peek()); System.out.println("Número de Elementos da Fila: " + fila.size()); } else { System.out.println("Pilha: " + pilha); System.out.println("Fila: " + fila); } } } Anexo 7.2 Solução da Lista: Mapas 7.2.1 ProgMap_1 // ---------------------------------------------------------------------------------------------- Programa Principal: ProgMap_1.java package progmap_1; import java.util.Arrays; import java.util.LinkedHashMap; public class ProgMap_1 { public static void main(String[] args) { LinkedHashMap pessoa = new LinkedHashMap(); pessoa.put(2, "Carla"); pessoa.put(4, "Eva"); pessoa.put(0, "Ana"); 262 pessoa.put(1, "Beatriz"); pessoa.put(3, "Debora"); for (Object key : pessoa.keySet()) { System.out.printf("%-7s -> (%d)\n", pessoa.get(key), key); } int n = pessoa.size(); String[] partes = new String[n]; String s = ""; for (int i = 0; i < partes.length; i++) { partes[i] = pessoa.get(i).toString(); } Arrays.sort(partes); System.out.print("Mapa: "); for (String parte : partes) { System.out.print(parte + " "); } System.out.println(); } } 7.2.2 ProgMap_2 // ------------------------------------------------------------------------------------------------- Programa Principal: ProgMap_2.java package progmap_2; import java.util.TreeMap; public class ProgMap_2 { public static void main(String[] args) { TreeMap<String, Integer> alunos = new TreeMap<>(); alunos.put("Carla", 67); alunos.put("Debora", 68); alunos.put("Beatriz", 66); alunos.put("Ana", 65); for (String key : alunos.keySet()) { System.out.printf("%-7s -> %c\n",key, alunos.get(key)); } System.out.println("keySet: " + alunos.keySet()); alunos.clear(); } } 7.2.3 ProgMap_3 // ------------------------------------------------------------------------------------------------ Programa Principal: ProgMap_3.java package progmap_3; import java.util.HashMap; import java.util.Map; public class ProgMap_3 { public static void main(String[] args) { Map<Integer, String> mapa = new HashMap<>(); mapa.put(5, "Eva"); mapa.put(2, "Beatriz"); mapa.put(3, "Carla"); mapa.put(1, "Ana"); mapa.put(4, "Debora"); int n = mapa.size(); for (int i = 1; i <= n; i++) { System.out.printf("Chave: %d | Pessoa: %-7s | Bytes: %d\n", i, mapa.get(i), mapa.get(i).length()); } 263 } } 7.2.4 ProgMap_4 // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgMap_4.java package progmap_4; import java.util.Hashtable; public class ProgMap_4 { public static void main(String[] args) { Hashtable pessoa = new Hashtable(); pessoa.put(20, "Beatriz"); // chave, valor pessoa.put(30, "Carla"); // chave, valor pessoa.put(10, "Ana"); // chave, valor System.out.println("Tamanho da Hashtable: " + pessoa.size()); System.out.println("Chaves: " + pessoa.keySet()); System.out.println("Valor: " + pessoa.values()); } } 7.2.5 ProgMap_5 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgMap_5.java package progmap_5; import java.util.HashMap; import java.util.Map; public class ProgMap_5 { public static void main(String[] args) { Map<String, String> mapa = new HashMap<>(); mapa.put("E", "Eva"); mapa.put("B", "Beatriz"); mapa.put("C", "Carla"); mapa.put("A", "Ana"); mapa.put("D", "Debora"); System.out.println("Número de Elementos do Mapa: " + mapa.size()); System.out.println("Mapa: " + mapa); System.out.println("Chaves: " + mapa.keySet()); System.out.println("Valores: " + mapa.values()); } } Anexo 8.6 Solução da Lista: Arquivos (File) 8.6.1 ProgFile_1 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_1.java package progfile_1; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class ProgFile_1 { 264 public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { long bytes; int linhas; int brancas; try (FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { bytes = 0; linhas = 0; brancas = 0; while ((linha = leitor.readLine()) != null) { System.out.println(linha); bytes = bytes + linha.length(); linhas++; if ("".equals(linha)) { brancas++; } } arqTexto.close(); } System.out.println("(" + bytes + ") Bytes"); System.out.println("(" + linhas + ") Linhas"); System.out.println("(" + brancas + ") Brancas"); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } } 8.6.2 ProgFile_2 // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_2.java package progfile_2; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class ProgFile_2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { int nl; do { try (FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { boolean encontrouLinha = false; System.out.print("Linha: "); String s = input.nextLine(); nl = Integer.parseInt(s); int linhas = 0; while ((linha = leitor.readLine()) != null) { linhas++; if (nl == linhas) { System.out.println(nl + ": " + linha); encontrouLinha = true; 265 } } if (!encontrouLinha && nl != 0) { System.out.println("ERRO: Linha não existe"); } if (nl == 0) { arqTexto.close(); } } } while (nl != 0); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } } 8.6.3 ProgFile_3 // --------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_3.java package progfile_3; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class ProgFile_3 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Arquivo Origem: "); String arquivoOrigem = input.nextLine(); System.out.print("Arquivo Destino: "); String arquivoDestino = input.nextLine(); long bytes = 0; try { FileWriter arqDestino; try (FileReader arqOrigem = new FileReader(arquivoOrigem); BufferedReader leitor = new BufferedReader(arqOrigem)) { arqDestino = new FileWriter(arquivoDestino); while ((linha = leitor.readLine()) != null) { bytes = bytes + linha.length(); arqDestino.write(linha + "\n"); } System.out.println("(" + bytes + ") Bytes copiados"); arqOrigem.close(); } arqDestino.close(); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo Origem"); } } } 8.6.4 ProgFile_4 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgFile_4.java package progfile_4; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; 266 import java.util.Scanner; public class ProgFile_4 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Arquivo Origem: "); String arquivoOrigem = input.nextLine(); System.out.print("Arquivo Destino: "); String arquivoDestino = input.nextLine(); System.out.print("[+] Maiúsculo ou [-] Minúsculo: "); String s = input.nextLine(); char tipo = s.charAt(0); long bytes = 0; try { FileWriter arqDestino; try (FileReader arqOrigem = new FileReader(arquivoOrigem); BufferedReader leitor = new BufferedReader(arqOrigem)) { arqDestino = new FileWriter(arquivoDestino); while ((linha = leitor.readLine()) != null) { bytes = bytes + linha.length(); if (tipo == '+') { arqDestino.write(linha.toUpperCase() + "\n"); } else { arqDestino.write(linha.toLowerCase() + "\n"); } } System.out.println("(" + bytes + ") Bytes copiados"); arqOrigem.close(); } arqDestino.close(); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo Origem"); } } } 8.6.5 ProgFile_5 // ------------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_5.java package progfile_5; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class ProgFile_5 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; boolean existe = false; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); System.out.print("Palavra: "); String palavra = input.nextLine(); try { try (FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { int line = 1; while ((linha = leitor.readLine()) != null) { if (linha.contains(palavra)) { System.out.println(line + ": " + linha); 267 existe = true; } line++; } arqTexto.close(); if (!existe) { System.out.println("Erro: Palavra não existe"); } } } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } } 8.6.6 ProgFile_6 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgFile_6.java package progfile_6; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class ProgFile_6 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { int nli, nlf; try (FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { boolean encontrouLinha = false; System.out.print("Número inicial: "); String s = input.nextLine(); nli = Integer.parseInt(s); System.out.print("Número final: "); s = input.nextLine(); nlf = Integer.parseInt(s); if (nli > nlf) { int temp = nli; nli = nlf; nlf = temp; } int line = 1; while ((linha = leitor.readLine()) != null) { if (line >= nli && line <= nlf) { System.out.println(line + ": " + linha); encontrouLinha = true; } line++; } arqTexto.close(); if (!encontrouLinha) { System.out.println("ERRO: Linha não existe"); } } } catch (IOException e) { 268 System.out.println("Erro: Problema com o Arquivo"); } } } 8.6.7 ProgFile_7 // ------------------------------------------------------------------------------------------------------------ Programa Principal: ProgFile_7.java package progfile_7; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class ProgFile_7 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String palavra; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { try (FileWriter arqTexto = new FileWriter(nomeArquivo)) { do { System.out.print("Palavra: "); palavra = input.nextLine(); if (!"".equals(palavra)) { arqTexto.write(palavra + "\n"); } } while (!"".equals(palavra)); arqTexto.close(); } } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } } 8.6.8 ProgFile_8 // ------------------------------------------------------------------------------------------------------ Programa Principal: ProgFile_8.java package progfile_8; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Scanner; public class ProgFile_8 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomeArquivo = input.nextLine(); try { try (FileReader arqTexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { while ((linha = leitor.readLine()) != null) { System.out.println(linha); } arqTexto.close(); 269 } } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } } 8.6.9 ProgFile_9 // --------------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_9.java package progfile_9; import java.io.FileWriter; import java.io.IOException; import java.io.RandomAccessFile; import java.util.Scanner; public class ProgFile_9 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto Origem: "); String arqOrigem = input.nextLine(); System.out.print("Nome do Arquivo Texto Destino: "); String arqDestino = input.nextLine(); try { FileWriter destino; try (RandomAccessFile origem = new RandomAccessFile(arqOrigem, "r")) { destino = new FileWriter(arqDestino); int numeroLinhas = 0; while (origem.readLine() != null) { numeroLinhas++; } origem.seek(0); // volta ao início do arquivo String[] nome = new String[numeroLinhas]; int n = 0; while ((linha = origem.readLine()) != null) { nome[n] = linha; n++; } sort(numeroLinhas, nome); origem.seek(0); for (int i = 0; i < numeroLinhas; i++) { destino.write(nome[i] + "\n"); } origem.close(); } destino.close(); System.out.println("Ok, arquivo ordenado e copiado"); } catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); } } static void sort(int n, String[] nome) { for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (nome[i].compareTo(nome[j]) > 0) { String temp = nome[i]; nome[i] = nome[j]; nome[j] = temp; } } } 270 } } 8.6.10 ProgFile_10 // ----------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_10.java package progfile_10; import java.io.File; import java.io.FileWriter; import java.util.Scanner; public class ProgFile_10 { public static void main(String[] args) throws Exception { Scanner input = new Scanner(System.in); String s; System.out.print("Nome do arquivo texto: "); String nomeArquivo = input.nextLine(); File arquivo = new File(nomeArquivo); if (!arquivo.exists()) { FileWriter file = new FileWriter(arquivo); do { System.out.print("Nome: "); String nome = input.nextLine(); file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = input.nextLine(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = input.nextLine(); char sexo = s.charAt(0); file.write(sexo); file.write(":"); System.out.print("Continua [S/N]? "); do { s = input.nextLine(); } while (!"SsNn".contains(s)); } while ("S".equalsIgnoreCase(s)); file.close(); } else { System.out.println("ERRO: Arquivo já existe"); } } } 8.6.11 ProgFile_11 // ---------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_11.java package progfile_11; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Scanner; public class ProgFile_11 { public static void main(String[] args) throws Exception { Scanner input = new Scanner(System.in); 271 System.out.print("Nome do arquivo texto: "); String nomeArquivo = input.nextLine(); File arquivo = new File(nomeArquivo); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { FileReader file = new FileReader(arquivo); String linha = buffer.readLine(); // lê todos os dados, ou seja, carrega toda a linha de dados System.out.println("Buffer: " + linha); // e joga numa String String[] partes = linha.split(":"); int n = partes.length; System.out.println("Partes: " + n); for (int i = 0; i < n; i = i + 3) { System.out.println("Nome: " + partes[i]); System.out.println("Idade: " + Integer.parseInt(partes[i + 1])); if (partes[i+1].equals("M") || partes[i+1].equals("m")) { System.out.println("Sexo: MASCULINO"); } else { System.out.println("Sexo: FEMININO"); } } file.close(); buffer.close(); } else { System.out.println("ERRO: Arquivo não existe"); } } } 8.6.12 ProgFile_12 // ------------------------------------------------------------------------------------------------- Programa Principal: ProgFile_12.java package progfile_12; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class ProgFile_12 { public static void main(String[] args) throws FileNotFoundException, IOException { Scanner input = new Scanner(System.in); System.out.print("Nome do arquivo texto: "); String nomeArquivo = input.nextLine(); File arquivo = new File(nomeArquivo); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { int homens, mulheres; try (FileReader file = new FileReader(arquivo)) { String linha = buffer.readLine(); // lê todos os dados da linha do arquivo texto e joga numa String System.out.println("Buffer: " + linha); String[] partes = linha.split(":"); int n = partes.length; homens = 0; mulheres = 0; for (int i = 0; i < n; i = i + 3) { if ("M".equals(partes[i+2]) || "m".equals(partes[i+2])) { homens++; } else { 272 mulheres++; } } } buffer.close(); in.close(); conversor.close(); System.out.println("(" + homens + ") Homens"); System.out.println("(" + mulheres + ") Mulheres"); } else { System.out.println("ERRO: Arquivo não existe"); } } } 273