Caros Amigos,

A classe ArrayList permite a criação e a manutenção de uma coleção ou lista indexada de objetos. Como nos vetores, índices de um ArrayList são baseados em zero, isto é, o índice do primeiro elemento é zero. Os métodos fornecidos possibilitam a manipulação de um elemento baseada na sua posição (ou índice) numérica na lista, remover determinado elemento, procurar as ocorrências de um dado elemento e percorrer sequencialmente todos os elementos da lista.

Mais informações sobre a classe ArrayList na implementação de vetores dinâmicos (ou redimensionáveis) podem ser obtidas no artigo "Explorando a Classe ArrayList no Java .

Os computadores utilizam os arquivos como estruturas de dados para armazenamento de longo prazo de grandes volumes de dados. Dados mantidos em arquivos são chamados de dados persistentes porque eles existem além da duração da execução do programa em dispositivos de armazenamento secundário como disquete, disco rígido, entre outros. Em um arquivo texto os dados são armazenados como uma sequência de caracteres dividida em linhas terminadas por um caractere de fim de linha. Os arquivos no formato texto geralmente são encontrados com nomes com a extensão padrão TXT (abreviação de TEXT, ou texto em inglês) e podem ser facilmente lidos ou abertos por qualquer programa que lê texto e, por essa razão, são considerados universais.

Os arquivos texto foram abordados em outros 3 (três) artigos:

  1. Arquivos e fluxos de dados - Revista Easy Java Magazine 12
  2. Criando e Gravando dados em Txt com Java
  3. Lendo dados de Txt com Java

A programação estruturada é uma forma de programação de computadores que estabelece uma disciplina ou sistemática para o desenvolvimento de algoritmos. À medida que os programas vão se tornando maiores e mais complexos, é possível simplificar e melhorar a clareza dividindo o programa em partes menores, chamadas subprogramas. Um subprograma é um nome dado a um trecho de um programa mais complexo e que, em geral, encerra em si próprio um pedaço da solução de um problema maior (o programa a que ele está subordinado). A solução estruturada é orientada a procedimentos, blocos estruturados de códigos na forma de procedimentos ou funções, em Java, métodos; a comunicação entre os blocos se faz utilizando variáveis globais (não constitui uma boa prática de programação) e pela passagem de dados através de parâmetros.

Os elementos chaves da programação estruturada foram abordados no artigo "Introdução à Programação Estruturada".

A aplicação Java, apresentada na Listagem 1, mostra uma solução baseada em menu para criar e manter uma agenda de contatos usando a classe ArrayList (para a manipulação dos dados na memória primária) e arquivo texto (na persistência dos dados) através de uma abordagem estruturada.

Listagem 1: Aplicação Java para criar e manter uma agenda de contatos


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class Exemplo {

  public static void main(String[] args) throws IOException {
    ArrayList<String> agenda = new ArrayList();
    Scanner ler = new Scanner(System.in);
    int opcao;

    importar(agenda);

    do {
      System.out.printf("**** Menu Principal *****\n");
      System.out.printf("[ 1 ] Incluir Contato\n");
      System.out.printf("[ 2 ] Excluir Contato\n");
      System.out.printf("[ 3 ] Listar Contatos\n");
      System.out.printf("[ 4 ] Pesquisar Contato\n");
      System.out.printf("[ 0 ] Encerrar o Programa\n");
      System.out.printf("\nOpção Desejada: ");

      opcao = ler.nextInt();

      switch (opcao) {
        case 1: incluir(agenda); break;
        case 2: excluir(agenda); break;
        case 3: listar(agenda); break;
        case 4: pesquisar(agenda);
      }

      System.out.printf("\n\n");

    } while (opcao != 0);

    exportar(agenda);
  }

  public static void importar(ArrayList<String> agenda) {
    try {
      FileReader arq = new FileReader("agenda.txt");
      BufferedReader lerArq = new BufferedReader(arq);
      String linha = lerArq.readLine(); // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo
      // de repetição atingir o final do arquivo texto
      while (linha != null) {
        agenda.add(linha);
        linha = lerArq.readLine(); // lê da segunda até a última linha
      }
      arq.close();
    } catch (IOException e) {
        System.err.printf("Erro na abertura do arquivo: %s.",
          e.getMessage());
    }
  }

  public static void exportar(ArrayList<String> agenda)
    throws IOException {
    FileWriter arq = new FileWriter("agenda.txt");
    PrintWriter gravarArq = new PrintWriter(arq);
    int i, n = agenda.size();
    for (i=0; i<n; i++) {
      gravarArq.printf("%s%n", agenda.get(i));
    }
    gravarArq.close();
  }


  public static void incluir(ArrayList<String> agenda) {
    Scanner ler = new Scanner(System.in);
    String nome, telefone;

    System.out.printf("\nInforme o nome do contato:\n");
    nome = ler.nextLine();

    System.out.printf("\nInforme o telefone do contato:\n");
    telefone = ler.nextLine();

    // grava os dados no final da "lista"
    agenda.add(nome + ";" + telefone);
  }

  public static void excluir(ArrayList<String> agenda) {
    Scanner ler = new Scanner(System.in);
    int i;

    listar(agenda);

    System.out.printf("\nInforme a posição a ser excluída:\n");
    i = ler.nextInt();

    try {
      agenda.remove(i);
    } catch (IndexOutOfBoundsException e) {
        // exceção lançada para indicar que um índice (i)
        // está fora do intervalo válido (de 0 até agenda.size()-1)
        System.out.printf("\nErro: posição inválida (%s).\n\n",
          e.getMessage());   
    }
  }

  public static void listar(ArrayList<String> agenda) {
    System.out.printf("\nListadando os itens da Agenda:\n");
    int i, n = agenda.size();
    for (i=0; i<n; i++) {
      System.out.printf("Posição %d- %s\n", i, agenda.get(i));
    }
    System.out.printf("---------------------------------------");
  }

  public static void pesquisar(ArrayList<String> agenda) {
    Scanner ler = new Scanner(System.in);
    String s;
    
    System.out.printf("\nInforme o nome do contato:\n");
    s = ler.nextLine();
    
    int i, n = agenda.size();
    s = s.toUpperCase();
    String dados[];
    for (i=0; i<n; i++) {
      // informando "joão", por exemplo, na entrada serão mostrados
      // todos os contatos que possuem "joão" no nome
      if (agenda.get(i).toUpperCase().indexOf(s) != -1) {
         dados = agenda.get(i).split(";");
         System.out.printf("\nNome....: %s", dados[0]);
         System.out.printf("\nTelefone: %s\n", dados[1]);
      }
    }
  }

}

O propósito principal da aplicação desenvolvida neste artigo foi explorar os elementos chaves da programação estruturada, em destaque, a divisão da solução em partes chamadas de métodos em Java e estabelecer a comunição destes através de parâmetros. Inicialmente foi definida uma estrutura de dados string usando a classe ArrayList para manter a agenda de contatos através da declaração "ArrayList <String> agenda = new ArrayList()".

O menu principal da aplicação, construído e gerenciado no método "main", apresenta as seguintes opções para o usuário final: [ 1 ] Incluir Contato, [ 2 ] Excluir Contato, [ 3 ] Listar Contatos, [ 4 ] Pesquisar Contato e [ 0 ] Encerrar o Programa. Antes de apresentar o menu, o método "importar" é invocado para recuperar os dados persistidos no arquivo texto "agenda.txt", mostrado na Figura 1. Cada linha do arquivo texto representa um contato, no formato "nome;telefone", que serão lidos e importados para a memória principal no ArrayList "agenda". Ao escolher a opção "[ 0 ] Encerrar Programa" desta vez será executado o método "exportar" para persistir na memória secundária, arquivo texto "agenda.txt", os dados mantidos no ArrayList "agenda".

Arquivo texto

Figura 1: Arquivo texto "agenda.txt" com 3 (três) contatos cadastrados

Descrevendo as rotinas executadas versus opções do menu principal:

[ 1 ] Incluir Contato: chama o método "incluir", solicita ao usuário os dados de um contato, nome e telefone, e adiciona o novo contato no final da lista através do comando "agenda.add(nome + ";" + telefone)".

[ 2 ] Excluir Contato: chama o método "excluir", mostra todos os contatos cadastrados na lista e obtém o índice do elemento a ser excluído. Remove o i-ésimo elemento da "agenda" com o comando "agenda.remove(i)" verificando a exceção "IndexOutOfBoundsException" que indica "índice fora do intervalo válido, de 0 até agenda.size()-1".

[ 3 ] Listar Contatos: chama o método "listar", mostra todos os contatos cadastrados na lista usando o índice e o método "get" na instrução "agenda.get(i)".

[ 4 ] Pesquisar Contato: chama o método "pesquisar", solicita ao usuário uma parte do nome do contato a ser pesquisado. Percorre a lista, usando o índice, mostrando todos os contatos que possuem em seu nome a parte informada pelo usuário (independente de caracteres maiúsculos e minúsculos). Esta verificação é realizada através da expressão lógica "agenda.get(i).toUpperCase().indexOf(s) != -1".

Ao executar a aplicação os resultados apresentados na Figura 2 poderão ser exibidos.

Executando as opções do menu principal

Figura 2: Executando as opções do menu principal

Obrigado e um abraço.

Prof. Omero Francisco Bertol http://www.pb.utfpr.edu.br/omero/

Aplicações Java (http://www.pb.utfpr.edu.br/omero/Java/Fontes.HTM)