Manipulacao de Arquivos texto usando estrutura de dados
2 respostas
G
Gisabmelo
Ola Pessoal! Preciso fazer um método que realize a leitura de um arquivo e crie uma tabela de aparições dos caracteres nele contidos. Onde o resultado final é a quantidade de vezes que cada caracter aparece no arquivo.Ate tentei usar a class Map, mas da maneira que preciso ler o arquivo nao consegui.
Alem disso, teria que usar alguma estrutura(vetor, pilha, fila, lista etc), e ordena-los de forma que os caracteres que aparecem mais vezes sejam os primeiros da estrutura!
A leitura eu e a contagem final de caracteres eu ja fiz:
FileInputStreamarquivoFisico=newFileInputStream("teste.txt");BufferedInputStreambuffReader=newBufferedInputStream(arquivoFisico);DataInputStreamdata=newDataInputStream(buffReader);intcont=0;bytevetByte[];vetByte=newbyte[arquivoFisico.available()];data.read(vetByte);for(charc:newString(vetByte).toCharArray()){System.out.print(c);cont++;}System.out.print("\nQuantidade de caracteres lidos ="+cont);}}
Entao, como faço para ordena-los e exibir a quantidade de cada caracter?
Você pode usar as classes de java.util (por exemplo, Map, List etc?) O seu problema é bem simples, na verdade.
Há várias coisas que você deve aprender.
Uma delas é que arquivos-texto (é isso que você quer ler, certo) não se lêem todos na memória, nem se lêem com FileInputStream e sim com FileReader.
A segunda é que você precisa usar duas estruturas de dados, não uma só.
Para ler um arquivo caracter por caracter, mas de forma rápida, você pode tentar algo como:
Você precisa duas estruturas de dados: uma para contar os caracteres - uma sugestão é criar um array de int de 65536 posições, inicializar todas as posições com zero, e então , a cada vez que você achar um caracter, ir incrementando a contagem. Exemplo:
A outra estrutura, que é a que você está com dificuldades de imaginar, é a que você vai ordenar de acordo com a frequência de cada caracter.
Primeiramente, crie uma classe bem simples:
e a seguir, preencha um ArrayList com todas as frequências que não são zero. Ou seja, suponha que o caracter ‘Z’ (código 90) tenha aparecido 4 vezes no seu texto.
Vou supor que o nome desse ArrayList seja frequencias.
Ele deve aparecer naquele array contagem como:
contagem[90]temovalor4
Então você adiciona ao arraylist de Frequencia um objeto Frequencia (ou seja, frequencias.add (new Frequencia(90, 4)).
Se o caracter ‘y’ (código 121) não apareceu nenhuma vez, o valor de contagem [121] vai ser zero, então você não adiciona ao ArrayList nenhum objeto Frequencia.
Por último, você ordena, usando Collections.sort, o ArrayList de forma decrescente. Uma forma de fazer isso seria:
Mto obrigada pela ajuda, isso esclareceu um pouco e consegui fazer a primeira parte. Agora preciso fazer a Codificação e gravação do arquivo com base nessa tabela de huffman e a Leitura, decodificação e gravação do arquivo descompactado. Tava dando uma pesquisada nos foruns e , cheguei a testar um exemplo como esse, usando LZW:
importjava.io.*;classLZW{publicstaticvoidmain(String[]args)throwsIOException{if(!args[0].equals("")){comprime(args[0]);descomprime("output.dat");}}privatestaticvoidcomprime(Stringnomearq){intatual,cont;String[]dicionario=newString[65536];for(cont=0;cont<256;cont++)dicionario[cont]=""+(char)cont;try{FileReaderfr=newFileReader(nomearq);FileOutputStreamtw=newFileOutputStream("output.dat");DataOutputStreamfw=newDataOutputStream(tw);Stringstr="";intlast=0;while((atual=fr.read())!=-1){str+=""+(char)atual;booleanadiciona=true;for(inti=0;i<cont;i++){if(dicionario[i].equals(str)){adiciona=false;last=i;}}if(adiciona){fw.writeByte((byte)(last/256));fw.writeByte((byte)(last%256));fw.writeByte((byte)atual);if(cont>=65536)cont=0;dicionario[cont]=str;cont++;str="";last=0;}}fw.writeByte((byte)-1);fr.close();fw.close();tw.close();System.out.println("Arquivo de texto comprimido para output.dat");}catch(FileNotFoundExceptionfnfE){System.out.println("Arquivo nao encontrado.");}catch(IOExceptionIOE){System.out.println("Excecao IO.");}}
Mas teria que fazer isso usando a classe bitset para “montar” os bits do arquivo a partir da tabela de huffman.
Agora como posso juntar todos estes binários em ordem de acordo com o texto para salvar em um arquivo compactado?
Por exemplo:
T e s t a n d o = 11001 11011 10110 0100 111 100 11010 1010
Testando = 1100111011101100100111100110101010