Salve,
Esse negócio de compressão de dados é outro tópico da hora que veremos nas nossas próximas reuniões.
Para usar classe Genome o arquivo a ser comprimido deve conter apenas os caracteres "ACGT".
O arquivo genome.txt nas notas de aula tem um '\n' no final. Vejam
% more genome.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% more genomeTiny.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% file genome.txt
genome.txt: ASCII text
% file genomeTiny.txt
genomeTiny.txt: ASCII text, with no line terminators
% wc genome.txt
1 1 34 genome.txt
% wc genomeTiny.txt
0 1 33 genomeTiny.txt
% java Genome - < genome.txt
Exception in thread "main" java.lang.IllegalArgumentException: Character
not in alphabet
at edu.princeton.cs.algs4.Alphabet.toIndex(Alphabet.java:188)
at Genome.compress(Genome.java:54)
at Genome.main(Genome.java:85)
% java Genome - < genomeTiny.txt | java BinaryDump 32
00000000000000000000000000100001
00110010001110010011001001100100
11001001110010001110111001110010
01000000
104 bits
De fato, '\n' não faz parte do alfabeto "ACGT".
compress() e expand()
Um coisa divertida e que ajuda a verificar se as função compress() e expand() estão ok é fazer
% java Genome - < genomeTiny.txt | java Genome + > genomeTiny.orig.txt
% more genomeTiny.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% more genomeTiny.orig.txt
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
% diff genomeTiny.txt genomeTiny.orig.txt
% java Genome - < genomeTiny.txt | java Genome + | more
ATAGATGCATAGCGCATAGCTAGATGTGCTAGC
%
Classe Genome
O main() da classe Genome é bem bobo.
Só serve para dizer o que devemos fazer: compress() ou expand().
public class Genome { public static void compress() { Alphabet DNA = new Alphabet("ACGT"); ... } public static void expand() { Alphabet DNA = new Alphabet("ACGT"); ... } public static void main(String[] args) { if (args[0].equals("-")) compress(); else if (args[0].equals("+")) expand(); else throw new IllegalArgumentException("Illegal command line argument"); } }
Entradas e saídas binárias
Nos próximos encontro usaremos entrade e saída de bits que são fornecidas pelo algs4 através das classes BinaryStdIn, BinaryStdOut, BinaryIn, BinaryOut. Como o Caio notou, a descrição de BinaryStdOut.write() estava errada no slide.
Corrigi, muito obrigado por avisar.
Mais informações podem ser encontrada na página Entrada e saída binárias do professor Paulo Feofiloff tem uma descrição muito boa dessas classes.
As classe BinaryStdIn, BinaryStdOut, BinaryIn e BinaryOut que usaremos tem muito métodos.
As APIs originais estão em BinaryStdIn, BinaryStdOut, BinaryIn, e BinaryOut.
Alphabet
A classe Alphabet que usamos hoje é essencialmente uma tabela. Aqueles e aquelas que estiverem interesados no funcionamento dessa tabela e de seus métodos toIndex() e toChar(), vejam a página Alfabetos (classe Alphabet) do professor Paulo Feofiloff.