虽然hasNext()不会结束

时间:2015-10-13 23:53:07

标签: java

我有一个作业的程序,我无法解读最后的花絮。 它需要能够接受一大段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.

2 个答案:

答案 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
}