我有一个作业的程序,我无法解读最后的花絮。
它需要能够接受一大段DNA" DNA"码。给出的样品在100,000+范围内。我首先写了一个小样本,一行,非常好。
TA告诉我,我应该能够添加一个while (input.hasNext())
,它将完成的不仅仅是我复制并粘贴到控制台的示例文件的第一行。当然这样做!它只是不会结束。我尝试使用我认为合适的break;
,但最终回到原来只计算一行。
Scanner scan = new Scanner(System.in); //Scanner
System.out.println("Enter a DNA sequence consisting of A, T, G, and C, on one line: "); //Instructions for user.
dnaSequence = scan.nextLine(); //Scan for next line of string.
dnaSequence = dnaSequence.toUpperCase(); //Converts all letters entered upper case to avoid issues.
while(scan.hasNext()){
for (int i = 0; i < dnaSequence.length(); i++) //Make i = 0, i has to be less than the length of the entered sequence, will excute count.
{
validCount = dnaSequence.charAt(i); //[FILL IN!]
switch (validCount) //Switch for all valid counts
{
case 'A' : //For any case A.
countA++; //Count all As.
break;
case 'T' : //For any case T.
countT++; //Count all Ts.
break;
case 'C' : //For any case C.
countC++; //Count all Cs.
break;
case 'G' : //For any case G.
countG++; //Count all Gs.
break;
}
}
totalCountGC = countG + countC; //Math for G and C, together.
totalCountSequence = countA + countT + countG + countC; //Math for total count of all other counts in switch.
答案 0 :(得分:3)
您永远不会消耗循环内的任何输入。实际读取新数据的唯一时间是在进入while循环之前,在此行:
dnaSequence = scan.nextLine();
所以基本上你所做的就是从输入中读取一行,然后一遍又一遍地在同一行上进行计算。
移动它,并在循环中移动toUpperCase
,它将继续读取新行,并最终消耗所有输入。
所以你的代码看起来像这样:
while(scan.hasNextLine()){
String dnaSequence = scan.nextLine().toUpperCase();
for (int i = 0; i < dnaSequence.length(); i++){
validCount = dnaSequence.charAt(i);
switch (validCount){
case 'A' :
countA++;
break;
case 'T' :
countT++;
break;
case 'C' :
countC++;
break;
case 'G' :
countG++;
break;
}
}
}
在这里,我假设您正在使用类似输入重定向的文件作为输入,而不是手动输入行。如果你确实在运行时输入它们,那么这将不起作用,因为程序无法知道你何时完成。
答案 1 :(得分:0)
System.in
是一个输入流,通常是
现在,因为用户可能正在创建将要发送到该流的数据(他可以在控制台中写入但尚未按Enter键)hasNext
需要等待决定直到
为了避免这个问题,您可以让用户提供某种特殊值,这将结束循环,如
while(scanner.hasNextLine()){
String line = scanner.nextLine();
if ("EXIT".equals(line))
break;
//if we are here it means loop should continue
handle(line);//or other code which will handle your data
}
为避免无限期等待打开的流(如System.in
),您可以选择其他选项。只需让扫描仪从已结束的源读取,如文件。
所以你的代码看起来像:
//input.txt should contain data you want to read
File data = new File("path/to/your/input.txt");
Scanner scanner = new Scanner(data);
while(scanner.hasNextLine()){
String line = scanner.nextLine();
//handle this line
}