我应该使用命令行参数编写一个程序来放入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。请帮助!
答案 0 :(得分:1)
您的代码中有几个错误应该受到责备。
从;
声明的末尾删除for()
。基本上,您只是从每个文件中读取一个字符,并且您的比较仅限于第一组字符。他们不太可能有任何重叠。
第二个错误:不要使用“文件长度”。字符通常被编码为多个字节,因此您将以这种方式获得不一致的结果。最好查询流以查看是否有更多可用字节,并在用完要读取的字节时停止。大多数Streams或Readers都有available
或ready
方法,可让您确定是否有更多内容可供阅读。
第三个错误:DataInputStream
不会按预期执行。 Read the docs - 你得到了奇怪的字符,因为它总是拉2个字节并使用修改后的UTF-8方案构建一个字符,该方案只能映射到相应的DataOutput
实现类所写的字符。您应该research并修改您的代码以使用BufferedReader
代替,这将更自然地尊重其他字符编码,如UTF-8等,这很可能是您正在阅读的文件的编码。< / p>
TL; DR?您的循环已损坏,文件长度对循环终止条件不利,DataInputStream
是一个特殊的独角兽,所以当使用BufferedReader
时处理普通文件中的字符。
答案 1 :(得分:0)
尝试使用浮点数而不是长数作为百分比变量。