2015-10-13 5 views
0

У меня есть программа для задания, с которой я не могу разгадать окончательный лакомый кусочек. Он должен уметь принимать большой фрагмент кода «ДНК». Указанные образцы находятся в диапазоне 100 000+. Сначала я писал, что хорошо работает над небольшим образцом, одна строка. TA сказал мне, что я должен иметь возможность добавить while (input.hasNext()), и он заполнит больше, чем только первая строка файла образца, который я копирую и вставляю в консоль. Это, безусловно, так! Это просто не закончится. Я пробовал использовать break;, где я думал, что это будет уместно, но вернитесь туда, где я был с подсчитанной только одной строкой.Пока hasNext() не закончится

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. 

ответ

3

Вы никогда не потребляете какой-либо входной сигнал внутри цикла. Единственный раз, когда вы на самом деле читать новые данные, прежде чем войти в то время цикла, на этой линии:

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; 
     } 
    } 
} 

В этом, я предполагаю, что вы используете что-то вроде перенаправления ввода из файла для ввода, и не набрав в строках вручную. Если вы на самом деле вводите их во время выполнения, это не сработает, поскольку программа не сможет узнать, когда вы закончите.

+3

Можно было бы также предположить, что было бы более целесообразно использовать 'hasNextLine' вместо' hasNext' для 'в то время как-loop' – MadProgrammer

+0

я знал, что это было что-то глупо просто!Большое вам спасибо, что я продолжал просматривать документы java и мои учебники, пытаясь выяснить, где я ошибся. Очень признателен. Также я не знал, что могу комбинировать nextline() и upperCase(). – GoldenDesign

0

System.in является входным потоком, который обычно

  • считывает данные из консоли
  • и открыт все время приложение работает.

Теперь, так как возможно, что пользователь находится в середине создания данных, которые будут посылать в этот поток (он может писать его в консоли, но не нажимал войти еще) hasNext нужно ждать с решением до

  • пользователь решит, посланных его данным,
  • или пока поток будет закрыт (как в случае конца файла)

чтобы избежать этой проблемы, вы можете позволить пользователю обеспечить своего рода s ПЕЦИАЛЬНОЕ значение, которое закончится цикл как

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 
} 
Смежные вопросы