Persistência

13 respostas
santosmm

Galera,

Foi passado o seguinte exercício em aula.

Para a contabilização dos votos da eleição de representante de turma, foi gerado um arquivo
contendo apenas o código do candidato, a cada vez que este recebia um voto. Faça um programa em
JAVA que seja capaz de:
➢ ler o arquivo contendo os votos (votos.txt);
➢ contabilizar a quantidade de votos que cada candidato recebeu;
➢ exibir o percentual de votos de cada candidato;
➢ contabilizar os votos nulos e em branco;
➢ criar um relatório, em arquivo, contendo o nome do primeiro e do segundo colocado na
eleição, com a quantidade de seus respectivos votos.
Considere os seguintes códigos:
1 ? Zé
2 ? Creuza
3 ? Afrânio
0 ? Voto em Branco
Qualquer outro código caracteriza voto NULO

public class Apuracao {

    /**
     * @param args the command line arguments
     */
    static StringBuffer memoria = new StringBuffer();

    public static void main(String[] args) {
        // TODO code application logic here
        try {
            String arquivo = EscolherArquivo.caminho();
            BufferedReader arqentrada;
            String linha = null;
            arqentrada = new BufferedReader(new FileReader(arquivo));
            while ((linha = arqentrada.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(linha, "*");
                while (st.hasMoreTokens()) {
                    System.out.println("Voto: " + st.nextToken());
                }
            }
            arqentrada.close();
        } catch (IOException e) {
            System.out.println("Erro: " + e.toString());
        }
    
    }
}

Mas não estou conseguindo manipular o conteúdo do arquivo de modo que possa contabilizar o total de votos.
Alguém sabe como me ajudar!?

13 Respostas

B

Qual é o formato desse arquivo de votos?

Tente um linha.split("[*]"); no lugar de StringTokenizer, ele vai voltar um array de String, depois com cada elemento pode fazer um if (elemento.equals(“1”) contZé++; e assim vai um monte de ifs para todos.

É o método mais simples.

santosmm

Bruno Laturner:
Qual é o formato desse arquivo de votos?

Tente um linha.split("[*]"); no lugar de StringTokenizer, ele vai voltar um array de String, depois com cada elemento pode fazer um if (elemento.equals(“1”) contZé++; e assim vai um monte de ifs para todos.

É o método mais simples.

Muito Obrigado pela ajuda…mais ainda não funcionou!
Help me!

B

O que não funcionou? Como é o layout dos dados no arquivo? Esse EscolherArquivo obtém o caminho certinho? Já debugou o código? Pelo menos um System.out.println já ajudaria para saber o conteúdo das variáveis.

santosmm

Bruno segue as 2 classe que fiz.

Esta primeira é a EscolherArquivo

package eleicao;

import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 *
 * @author santosmm
 */
public class EscolherArquivo {
    public static String caminho(){
     JFileChooser fileChooser = new JFileChooser();
     fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
     int result = fileChooser.showOpenDialog(null);
     if (result == JFileChooser.CANCEL_OPTION)
          return null;
     File arquivo = fileChooser.getSelectedFile();
     if(arquivo == null || arquivo.getName().equals(""))
        JOptionPane.showMessageDialog(null,"Nome do arquivo inválido");
     else
         return arquivo.getPath();
     return null;


    }

}

////////////////////////////////////////////////////////////////////////////////////////////

E esta é a principal

* To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package eleicao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;

/**
 *
 * @author santosmm
 */
public class Apuracao {

    /**
     * @param args the command line arguments
     */
    static StringBuffer memoria = new StringBuffer();

    public static void main(String[] args) {
        // TODO code application logic here
        try {
            String arquivo = EscolherArquivo.caminho();
            BufferedReader arqentrada;
            String linha = null;
            arqentrada = new BufferedReader(new FileReader(arquivo));
            while ((linha = arqentrada.readLine()) != null) {
                StringTokenizer voto = new StringTokenizer(linha, "*");
                while (voto.hasMoreTokens()) {
                    System.out.println("Voto: " + voto.nextToken());
                }
            }
            arqentrada.close();
        } catch (IOException e) {
            System.out.println("Erro: " + e.toString());
        }
    
    }
}
santosmm

Segue também o layout do arquivo .txt.

B

Não tem nenhum * no arquivo para você usar como separador… Se você não tem caracter separador, use uma string vazia “”.

santosmm
Bruno Laturner:
Não tem nenhum * no arquivo para você usar como separador... Se você não tem caracter separador, use uma string vazia "".

Veja se entendi bem....você esta propondo eu substituir o StringTokenizer por String correto?
Mas não estou conseguindo visualizar como ficaria o código....devo esta errando na lógica.

public static void main(String[] args) {
        // TODO code application logic here
        try {
            String arquivo = EscolherArquivo.caminho();
            BufferedReader arqentrada;
            String linha = null;
            arqentrada = new BufferedReader(new FileReader(arquivo));
            while ((linha = arqentrada.readLine()) != null) {
                StringTokenizer voto = new StringTokenizer(linha, "");
                while (voto.hasMoreTokens()) {
                    System.out.println("Voto: " + voto.nextToken());
                }
            }
            arqentrada.close();
        } catch (IOException e) {
            System.out.println("Erro: " + e.toString());
        }
    
    }
}
B

public static void main(String[] args) { // TODO code application logic here try { String arquivo = EscolherArquivo.caminho(); BufferedReader arqentrada; String linha = null; arqentrada = new BufferedReader(new FileReader(arquivo)); while ((linha = arqentrada.readLine()) != null) { String[] votos = linha.split(""); for (String voto: votos) { System.out.println("Voto: " + voto); } } arqentrada.close(); } catch (IOException e) { System.out.println("Erro: " + e.toString()); } } }

santosmm

Show de bola cara!
Muito obrigado mesmo…agora vou tentar fazer os “IFS” para manipular o resultado…mais uma vez obrigado.

santosmm

Não consigo apresentar o número de votos.
Poderia me ajudar?

public static void main(String[] args) {
        // TODO code application logic here
        try {
            String arquivo = EscolherArquivo.caminho();
            BufferedReader arqentrada;
            String linha = null;
            int numero = 0;
            int contZe = 0;
            int contCreuza = 0;
            int contAfranio = 0;
            int contVB = 0;
            int contOutros = 0;
            arqentrada = new BufferedReader(new FileReader(arquivo));
            while ((linha = arqentrada.readLine()) != null) {
                numero = Integer.parseInt(linha);
                if (numero == 1) {
                    contZe++;
                } else if (numero == 2) {
                    contCreuza++;
                } else if (numero == 3) {
                    contAfranio++;
                } else if (numero == 0) {
                    contVB++;
                } else{
                    contOutros++;
                }
            }
            System.out.println("O número de votos de Zé é " + contZe);
            System.out.println("O número de votos de Creuza é " + contCreuza);
            System.out.println("O número de votos de Afrânio é " + contAfranio);
            System.out.println("O número de votos de em Branco é " + contVB);
            System.out.println("O número de votos nulos é " + contOutros);
            arqentrada.close();
        } catch (IOException e) {
            System.out.println("Erro: " + e.toString());
        }

    }
}
santosmm

O erro é o seguinte:

java.lang.NumberFormatException: For input string: “”

B

santosmm, você, novamente, ignorou o que eu postei da última vez.

Você tem uma linha no formato 012301230123012301230123, sendo que cada caracter dessa linha é um código para o candidato. O que você não está fazendo é pegar cada caracter, um de cada vez, e contar cada voto a partir deles. O javadoc da classe String explica todos os métodos que você precisa. Veja os métodos charAt, o split (que usei antes), ou o toCharArray, os três podem resolver o problema.

Obs: Não precisa transformar os códigos para int, comparação de char também funciona.

santosmm

Bruno muito obrigado mesmo cara, realmente fui negligente e faltou-me um pouquinho de lógica de programação.
Mas agora já esta funcionando....olha o código ai:

public static void main(String[] args) {
        // TODO code application logic here
        try {
            String arquivo = EscolherArquivo.caminho();
            BufferedReader arqentrada;
            String linha = null;
            //String numero =
            int contZe = 0;
            int contCreuza = 0;
            int contAfranio = 0;
            int contVB = 0;
            int contOutros = 0;
            arqentrada = new BufferedReader(new FileReader(arquivo));
            while ((linha = arqentrada.readLine()) != null) {
               // numero = Integer.parseInt(linha);
                if (linha.equals("1")) {
                    contZe++;
                } else if (linha.equals("2")) {
                    contCreuza++;
                } else if (linha.equals("3")) {
                    contAfranio++;
                } else if (linha.equals("0")) {
                    contVB++;
                } else {
                    contOutros++;
                }
            }
            System.out.println("O número de votos de Zé é " + contZe);
            System.out.println("O número de votos de Creuza é " + contCreuza);
            System.out.println("O número de votos de Afrânio é " + contAfranio);
            System.out.println("O número de votos de em Branco é " + contVB);
            System.out.println("O número de votos nulos é " + contOutros);
            arqentrada.close();
        } catch (IOException e) {
            System.out.println("Erro: " + e.toString());
        }

    }
}
Criado 11 de dezembro de 2009
Ultima resposta 15 de dez. de 2009
Respostas 13
Participantes 2