Como contar caracteres num arquivo?

:?:
olá.queria uma ajudinha. queria saber como faço para contar caracteres em um aruivo, não é pra saber quantos caracteres tem, mas sim saber quantas vezes aparece cada caractere diferente. tipo quantas vezes aparece a letra a, b ou espaço em branco.

não sei se é legal eu perguntar aki. é porque é pra um trabalhode classe. mas sei q é melhor q procurar códigos prontos no google. e o trabalho não é apenas isso, ´mas isso poderia me ajudar muito.
abrigado pessoal!

Olá
bom, acho que vc se refere a manupular String não é?
eu faço o seguinte:

String dado = “teste de String”;

for(int i = 0; i <dado.lenght(); i++){
Character caracter = dado.charAt(i);

essas duas linhas acima vão diluir toda sua String de modo que vc possa manipular cada “caracter” dela. assim vc pode saber, por meio de IF’s… os dados que vc deseja.
manipular String é um método que estou usando para treinar minha lógica e conhecimento da linguagem. com manipulação de String já fiz muitas coisas, até uma base dados em arquivos txt (formato ASCI - eu acho).

faz um testezinho simples aí para vc ver

um abraço

Para fazer a contagem, considere usar um map<Character, Integer> ou, se você tiver certeza de que só aparecem caracteres convertíveis para ascii um
char[255].

Bom dia souarte,
como o ViniGodoy disse, você poderia usar um Map<Character, Integer> para resolver seu problema.
Veja o código abaixo:

        // Cria o Map e um StringBuffer
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        StringBuffer string = new StringBuffer();
        
        // Lê o arquivo e armazena em um StringBuffer
        try {
            FileReader reader = new FileReader("c:\teste.txt");   
            BufferedReader leitor = new BufferedReader(reader);   

            String linha = null;
            while((linha = leitor.readLine())!= null) {
                string.append(linha);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        // Armazena a quantidade de cada letra no Map
        for (int i = 0; i < string.length(); i++)
            if (map.get(string.charAt(i)) == null)
                map.put(string.charAt(i), 1);
            else
                map.put(string.charAt(i), map.get(string.charAt(i)) + 1);
        
        // Imprime a quantidade de Cada letra
        Object[] a = map.keySet().toArray();
        Iterator i =  map.values().iterator();
        System.out.println("Quantidade de letras: ");
        for (int j = 0; j < a.length; j++) {
            System.out.print(a[j] + " = ");
            System.out.print(i.next() + "\n");
        }

Para este caso em particular, você pode usar um array mesmo, que é bastante simples.

Basta se lembrar que um caracter pode ir de 0 até 65535, ou seja, você pode criar um array de 65536 inteiros, e incrementar o elemento a cada vez que você achar o caracter correspondente.

Na hora de mostrar as freqüências, você pode varrer esse array e só imprimir os valores de contagem quando eles forem diferentes de zero.

muito legal as respostas.
eu vi na API que FileInputStram lê bytes, eu poderia usá-la? e qual seria melhor?

vocês podem me indicar algum tutorial explicando sobre os tipos de caracteres, tipo ASCII, e esses negócio que eu não intendo?

sou iniciante, desculpa a iguinorancia. obrigado pelas respostas!

[quote]Map<Character,Integer> map = new HashMap<Character,Integer>();
StringBuffer string = new StringBuffer();

// Lê o arquivo e armazena em um StringBuffer
try {
FileReader reader = new FileReader(“c:\teste.txt”);
BufferedReader leitor = new BufferedReader(reader);

String linha = null;   
while((linha = leitor.readLine())!= null) {   
    string.append(linha);   
}   

} catch (Exception ex) {
ex.printStackTrace();
}
[/quote]
olá Pessoal,
me tirem só uma dúvida, se não me engano o FileReader ler caracter por caracter, então seria errado eu tentar simplificar o código do Brunolinsales e em vez de usar bufferedReader e stringBuffer eu usar somente o fileReader e já ir colocando os caracteres direto no hashMap?
é só uma idéia que tive. por favor, me digam se posso fazer isso, e se não puder, qual o problema.

obrigado!

vc pode ler usando BufferedReader e colocar dentro de um array e String… e depois passar para um conjunto todo o array… e mandar exibir o tamanho do conjunto.

eu faria dessa forma…

[quote=souarte]muito legal as respostas.
eu vi na API que FileInputStram lê bytes, eu poderia usá-la? e qual seria melhor?

vocês podem me indicar algum tutorial explicando sobre os tipos de caracteres, tipo ASCII, e esses negócio que eu não intendo?

sou iniciante, desculpa a iguinorancia. obrigado pelas respostas![/quote]

No Unicode, alguns caracteres são representados por mais de um e, as vezes, mais de dois bytes. Existem também caracteres iguais que podem ser representados por conjuntos de bytes diferentes.

Para entender isso melhor, leia esse post aqui:
http://www.guj.com.br/posts/list/73840.java#388365

O FileReader faz a leitura da maneira correta, respeitando o Encoding do seu texto.

Você pode usar só o BufferedReader e o HashMap. O que você falou até daria para fazer, mas eu não recomendo. A leitura sem um buffer é muito mais lenta, então, é preferível acostumar-se com ele. E só o BufferedReader tem o método readLine.

brigadao caras!!
ajudaram de verdade!