字符匹配DNA程序

时间:2014-03-21 15:27:43

标签: java file-io char

我应该使用命令行参数编写一个程序来放入3个不同的文件,一个人类DNA序列,一个小鼠DNA序列和一个未知序列。在不使用数组的情况下,我必须比较每个字符并给出百分比匹配以及它与之匹配的最佳匹配。这是我到目前为止所拥有的

import java.io.File;
import java.io.FileInputStream;
import java.io.DataInputStream;
import java.io.*;
public class Lucas_Tilak_Hw8_DNA 
{   
    public static void main (String args[]) throws IOException
    {
        //First let's take in each file 
        File MouseFile = new File(args[0]);
        File HumanFile = new File(args[1]);
        File UnknownFile = new File(args[2]);

        //This allows us to view individual characters 
        FileInputStream m = new FileInputStream(MouseFile);
        FileInputStream h = new FileInputStream(HumanFile);
        FileInputStream u = new FileInputStream(UnknownFile);

        //This allows us to read each character one by one.
        DataInputStream mouse = new DataInputStream(m);
        DataInputStream human = new DataInputStream(h);
        DataInputStream unk = new DataInputStream(u);

        //We initialize our future numerators
        int humRight = 0;
        int mouRight = 0;

        //Now we set the counting variable
        int countChar = 0;
        for( countChar = 0; countChar < UnknownFile.length(); countChar++);
        {
            //initialize
            char unkChar = unk.readChar();
            char mouChar = mouse.readChar();
            char humChar = human.readChar();

            //add to numerator if they match
            if (unkChar == humChar)
            {
                humRight++;
            }
            if (unkChar == mouChar)
            {
                mouRight++;
            }
            //add to denominator
            countChar++;
        }   
        //convert to fraction
        long mouPercent = (mouRight/countChar);
        long humPercent = (humRight/countChar);

        //print fractions
        System.out.println("Mouse Compare: " + mouPercent);
        System.out.println("Human Compare: " + humPercent);
        if (mouPercent > humPercent)
        {
            System.out.println("mouse");
        }
        else if (mouPercent < humPercent)
        {
            System.out.println("human");
        }
        else
        {
            System.out.println("identity cannot be determined");
        }
    }
}

如果我为我使用的每个文件输入随机代码{G,T,C,A},它似乎没有比较字符,所以我得到O = mouPercent和0 = humPercent。请帮助!

2 个答案:

答案 0 :(得分:1)

您的代码中有几个错误应该受到责备。

;声明的末尾删除for()。基本上,您只是从每个文件中读取一个字符,并且您的比较仅限于第一组字符。他们不太可能有任何重叠。

第二个错误:不要使用“文件长度”。字符通常被编码为多个字节,因此您将以这种方式获得不一致的结果。最好查询流以查看是否有更多可用字节,并在用完要读取的字节时停止。大多数Streams或Readers都有availableready方法,可让您确定是否有更多内容可供阅读。

第三个错误:DataInputStream不会按预期执行。 Read the docs - 你得到了奇怪的字符,因为它总是拉2个字节并使用修改后的UTF-8方案构建一个字符,该方案只能映射到相应的DataOutput实现类所写的字符。您应该research并修改您的代码以使用BufferedReader代替,这将更自然地尊重其他字符编码,如UTF-8等,这很可能是您正在阅读的文件的编码。< / p>

TL; DR?您的循环已损坏,文件长度对循环终止条件不利,DataInputStream是一个特殊的独角兽,所以当使用BufferedReader时处理普通文件中的字符。

答案 1 :(得分:0)

尝试使用浮点数而不是长数作为百分比变量。