[Dúvida] Contagem de substrings iguais em um arquivo txt

gente … preciso de uma idéia …
tenho um arquivo txt … ex:

111112222233333444445555566666
111112222233333444445555566666
222222222233333444445555566666
222222222233333444445555566666
111112222233333444445555566666
333332222233333444445555566666
111112222233333444445555566666


neste arquivo quero usar os 5 primeiros dígitos , utilizei substring …
agora … eu quero fazer as contagens dos 5 primeiros digitos , que são iguais
ficaria assim no caso

11111 = 4
22222 = 2
33333 = 1

será que consegui me expressar direito?

Vlw

Use um HashMap<String,Integer>. Para cada linha que você recupera, procure por uma entrada no map usando sua string de 5 posições como chave. Se houver, atualize a entrada acrescentando 1 ao número. Se não, insira uma entrada nova com o valor um.

no meu aqui … eu estava fazendo o seguinte …

[code]
public String getQuantidade()
{
try
{
EntradaQuantidade = new Scanner( new File( “Arquivo.txt” ) ) ; //aqui a leitura do arquivo

}
catch ( FileNotFoundException filesNotFoundException )
{
System.err.println( “Erro ao abrir arquivo. Arquivo Inexistente.” );
System.exit ( 1 ) ;
}
while (EntradaQuantidade.hasNextLine())
{

// aqui eu faria a contagem …
setDadoFull(EntradaQuantidade.nextLine()); // aqui o dado completo … ex: " 111112222233333444445555566666 "

}
}[/code]

… quando eu queria mostrar os 5 primeiros … no caso eu fazia assim:

return DadoFull.substring(0,4);

Vou dar uma procurada sobre o hashmap … pois desconheço do mesmo …
Qualquer ideia ae gente postem por favor…

Bom gente … ja comecei aqui … estou usando o netbeans (os arquivos estão em anexo).
Seguinte … ja encontrei um probleminha aqui… pelo que estou vendo terei que usar arrays … e gostaria de algumas idéias ae …
no arquivo .txt (em anexo) , ha alguns numeros que podem se repetir … [exemplo : ol concessora (getIdOlConcessao) ] …
no caso … na construção do novo arquivo .txt , esse número não poderia se repetir … no caso , entraria a quantidade também (getQuantidade) …
procurei exemplos de Hashmap , mas não achei uma explicação que fosse parecida com o que eu estou procurando… se alguem puder me dar um exemplo eu agradecerei.

Ps: eu quero uma maneira de criar este arquivo txt , que seja a mais rápida(não sei se é só com o uso do hashmap que é possível) … pois o arquivo .txt que a aplicação irá ler é bem grande (tem cerca de umas 500.000 linhas … )

Vlw ae gente… se alguém não entendeu alguma coisa é só avisar que vou explicando…

opa, e aí cara…

acredito que seja mais ou menos isso que tu queira…

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class teste
{
    public static void main(String[] args)
    {
        String filename = "C:\arquivo.txt";
        List<String> texto = lerArquivo(filename);
        Map<String, Integer> mapaDeContagens = new HashMap<String, Integer>();

        for (String linhaDoTexto : texto) {
            String primeirosCinco = linhaDoTexto.substring(0, 4);
            // se ainda nao tinha contagem...
            if (mapaDeContagens.get(primeirosCinco) == null) {
                // entao coloca contagem = 1
                mapaDeContagens.put(primeirosCinco, 1);
            } else {
                Integer cont = mapaDeContagens.get(primeirosCinco);
                cont++;
                mapaDeContagens.put(primeirosCinco, cont);
            }
        }
        System.out.println(mapaDeContagens.entrySet());
    }

    public static List<String> lerArquivo(String filename)
    {
        // implemente uma forma para que o conteudo
        // as linhas venham de um arquivo
        List<String> arquivo = new ArrayList<String>();
        arquivo.add("111112222233333444445555566666");
        arquivo.add("111112222233333444445555566666");
        arquivo.add("222222222233333444445555566666");
        arquivo.add("222222222233333444445555566666");
        arquivo.add("111112222233333444445555566666");
        arquivo.add("333332222233333444445555566666");
        arquivo.add("111112222233333444445555566666");
        return arquivo;
    }
}

a saida desse app é “[3333=1, 2222=2, 1111=4]”

feito

[quote=sf.marcius]opa, e aí cara…

acredito que seja mais ou menos isso que tu queira…

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class teste
{
    public static void main(String[] args)
    {
        String filename = "C:\arquivo.txt";
        List<String> texto = lerArquivo(filename);
        Map<String, Integer> mapaDeContagens = new HashMap<String, Integer>();

        for (String linhaDoTexto : texto) {
            String primeirosCinco = linhaDoTexto.substring(0, 4);
            // se ainda nao tinha contagem...
            if (mapaDeContagens.get(primeirosCinco) == null) {
                // entao coloca contagem = 1
                mapaDeContagens.put(primeirosCinco, 1);
            } else {
                Integer cont = mapaDeContagens.get(primeirosCinco);
                cont++;
                mapaDeContagens.put(primeirosCinco, cont);
            }
        }
        System.out.println(mapaDeContagens.entrySet());
    }

    public static List<String> lerArquivo(String filename)
    {
        // implemente uma forma para que o conteudo
        // as linhas venham de um arquivo
        List<String> arquivo = new ArrayList<String>();
        arquivo.add("111112222233333444445555566666");
        arquivo.add("111112222233333444445555566666");
        arquivo.add("222222222233333444445555566666");
        arquivo.add("222222222233333444445555566666");
        arquivo.add("111112222233333444445555566666");
        arquivo.add("333332222233333444445555566666");
        arquivo.add("111112222233333444445555566666");
        return arquivo;
    }
}

a saida desse app é “[3333=1, 2222=2, 1111=4]”

feito[/quote]

Opa … é realmente + - isso que eu quero fazer …
seguinte … para ele mostrar apenas os valores de cont eu uso o System.out.println(mapaDeContagens.values()) certo?!? …
e para mostrar apenas os valores de primeirosCinco ?

Vlw

opa,

para pegar o conjunto de valores (contagens)

// Retorna uma Collection, nesse caso, Collection<Integer> mapaDeContagens.values()

para pegar o conjunto de chaves (primeirosCinco)

// Retorna um Set, nesse caso, Set<String> mapaDeContagens.keySet()

para pegar o conjunto de tuplas (primeirosCinco, contagem)

// Retorna um Set de Entries (Tuplas), nesse caso, Entry<String, Integer> mapaDeContagens.entrySet()

para pegar a contagem de linhas que começam por “11111”, por ex:

// retorna um Integer mapaDeContagens.get("11111");

[]s

Seguinte … para eu fazer a leitura das linhas do arquivo .txt eu estou utilizando o Scanner e o file…

ficou + - assim…

[code]

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

/**
*

  • @author skindedo
    */
    public class LerArquivo {
    private static Scanner entrada;
    public static void main(String args[])
    {

     		try
     {
     entrada = new Scanner( new File( "arquivo.txt" ) ) ;
    
     }
     catch ( FileNotFoundException filesNotFoundException )
     {
     System.err.println( "Erro ao abrir arquivo. Arquivo Inexistente." );
     System.exit ( 1 ) ;
     }
    
    
    
     while (entrada.hasNextLine()) //aqui no caso ficaria a contagem das linhas
     {
    
            //aqui eu colocaria a variável das linhas do texto com o nextLine
    
    
     }
    

    }
    }[/code]

como que vou fazer para implementar naquela parte utilizando o Scanner?

vc quer um método para ler arquivos-texto?

aqui tem um:

    public List<String> lerArquivo(String caminhoParaArquivo) throws FileNotFoundException, IOException
    {
        File file = new File(caminhoParaArquivo);
        List<String> arquivoLido = new ArrayList<String>();
        BufferedReader br = new BufferedReader(new FileReader(file));
        for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
            arquivoLido.add(linha);
        }
        br.close();
        return arquivoLido;
    }

umas dicas…
vc criou uma classe de nome LerArquivo. Geralmente ocorre o seguinte. Se aquilo que a gente quer é uma entidade (Substantivo) a gente cria uma classe. Já se é uma ação (Verbo), então, cria-se um método.

Então eu criaria uma Classe de nome ArquivoTexto, por ex. e dentro dessa classe eu definiria o método “lerArquivo()”, que nada mais é que uma ação que a entidade “ArquivoTexto” executa

feito!

[quote=sf.marcius]vc quer um método para ler arquivos-texto?

aqui tem um:

    public List<String> lerArquivo(String caminhoParaArquivo) throws FileNotFoundException, IOException
    {
        File file = new File(caminhoParaArquivo);
        List<String> arquivoLido = new ArrayList<String>();
        BufferedReader br = new BufferedReader(new FileReader(file));
        for (String linha = br.readLine(); linha != null; linha = br.readLine()) {
            arquivoLido.add(linha);
        }
        br.close();
        return arquivoLido;
    }

umas dicas…
vc criou uma classe de nome LerArquivo. Geralmente ocorre o seguinte. Se aquilo que a gente quer é uma entidade (Substantivo) a gente cria uma classe. Já se é uma ação (Verbo), então, cria-se um método.

Então eu criaria uma Classe de nome ArquivoTexto, por ex. e dentro dessa classe eu definiria o método “lerArquivo()”, que nada mais é que uma ação que a entidade “ArquivoTexto” executa

feito![/quote]

Sim … isso foi o que eu fiz … é por que o método de ler o arquivo estava dentro da classe … dai eu copiei e colei ele em uma nova classe para limpá-lo só deixando o Scanner para postar aqui … mas na aplicação mesmo ele está como método =)

PS: cara por enquanto muito obrigado … ta dando certo aqui =) vlw msm

Pode olhar isso se quiser:
http://www.guj.com.br/posts/list/15/114205.java#617636