Salve, Aqui vão uns comentários que podem ajudar com o EP11.
Leitura de dados
-
o
main()
da classeMoveToFront
é idêntica aomain()
da classeHuffman
. Veja o programaHuffman.java
na página doalgs4
ou doPF
-
a leitura do o string da entrada padrão do
encode()
da classeMoveToFront
pode ser feita de manaira indêntica ao métodocompress()
da classeHuffman
. Para testar, leia o string e guarde e armazena a referência para o string em uma variávels
e depois façaBinaryStdOut.write(s);
ou
for (int i = 0; i < s.length(); i++) BinaryStdOut.write(s.charAt(i));
Faça apenas isso para verificar que se você está conseguindo ler da entrada padrão.
-
A saída do
encode()
é um fluxo de bytes para a saída padrão. Assim, você pode usarBinaryStdOut.write(valor, 8);
-
Para entender o que faz o método
encode()
deMoveToFront
considere o arquivoaaaabaaa.txt
criado da seguinte maneira.% echo -n aaaabaaa > aaaabaaa.txt % more aaaabaaa.txt aaaabaaa % file aaaabaaa.txt aaaabaaa.txt: ASCII text, with no line terminators
-
Veja a saída de
MoveToFront
para esse arquivo.% java MoveToFront - < aaaabaaa.txt | java HexDump 8 61 00 00 00 62 01 00 00 64 bits
0x61
, 61 em hexa, 97 em decimal, é o código para 'a'-
0x62
, 62 em hexa, 98 em decimal, é o código para 'b' Um caractere é um valor entre 0 e 255. Não há distinção entre o símbolo gráfico e o valor que o representaWelcome to DrJava. Working directory is /home/coelho/Dropbox/mac0323/assignments/8puzze > 'a' == 97 true > 'a' == 0x61 true > 0x61 97 > 'b' == 98 true > 'b' == 0x62 true > 0x62 98 >
-
No nosso caso, o tamanho do alfabeto é 256 (de 0 a 255) que corresponde a ASCII estendido. Inicialmente,
MoveToFront
tem um vetor digamos,codigo
do tamanha do alfabeto tal quecodigo[i] == i
Assim, inicialmente
codigo[0x61] == 'a' (0x61 == 97)
. Processamento do arquivoaaaabaaa.txt
porencode()
Processamento do arquivo aaaabaaa.txt
Quando o primeiro caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 95 == 0x61`. Depois,
'a'`` é movido para o ínício do vetor de código e o vetor passa a ser
codigo[0] == 97 == 'a'
codigo[1] == 0
codigo[2] == 1
[...]
codigo[97] == 96 !!!
codigo[98] == 98 == 'b' !!!
codigo[99] == 99 == 'c'
[...]
codigo[255] = 255
Quando o segundo caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 0 == 0x00 Depois, 'a'
é movido para o ínício do vetor de código. No caso o vetor fica igual
Quando o terceiro caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 0 == 0x00
Depois, 'a'
é movido para o ínício do vetor de código. No caso o vetor fica igual
Quando o quarto caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 0 == 0x00
Depois, 'a'
é movido para o ínício do vetor de código. No caso o vetor fica igual
Quando o caractere 'b'
é lido o programa escreve para a saída padrão o índice da posição em que 'b'
está, ou seja, 98 == 0x62
Depois, 'b' é movido para o ínício do vetor de codigo e o vetor passa a ser
codigo[0] == 98 == 'b'
codigo[1] == 97 == 'a'
codigo[2] == 0
codigo[3] == 1
[...]
codigo[97] == 95
codigo[98] == 96 !!!
codigo[99] == 99 == 'c'!!!
[...]
codigo[255] == 255
Quando o próximo caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 1 == 0x01
Depois, 'a'
é movido para o ínício do vetor de codigo e o vetor passa a ser
codigo[0] == 97 == 'a'
codigo[1] == 98 == 'b'
codigo[2] == 0
codigo[3] == 1
[...]
codigo[97] = 95
codigo[98] = 96 !!!
codigo[99] = 99 == 'c'!!!
[...]
Quando o proximo caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 0 == 0x00 Depois, 'a'
é movido para o ínício do vetor de código. No caso o vetor fica igual
Quando o último caractere 'a'
é lido o programa escreve para a saída padrão o índice da posição em que 'a'
está, ou seja, 0 == 0x00
Depois, 'a'
é movido para o ínício do vetor de código. No caso o vetor fica igual
Terminou o processamento de "aaaabaaa"
Veja a API para BinaryStdOut
e BinaryStdIn
em caso de dúvida.