2014-01-19 3 views
0

Так что я уверен, что использую следующий и hasNext неправильно ... Я пытаюсь ввести строку символов ACGT, а затем подсчитать отдельные результирующие буквы. Заранее спасибо.Использование next() в параметре if/else statement

import java.util.Scanner; 

public class A1Novice { 
    public static void main(String[] args){ 
     String input = ""; 
     Scanner s = new Scanner(System.in); 
     Scanner j = new Scanner(input); 
     System.out.println("Enter nucleobases (enter end when done)"); 
     while(true){ 
      input = s.next() + input; 
      if(s.next().contains("end")){ 
       break; 
      } 
     } 
     process(j, input); 
    } 

    public static void process(Scanner j, String input){ 
     int a = 0, c = 0, g = 0, t = 0; 
     while(j.hasNext()){ 
      if (j.next()=="A"){ 
       a++; 
      } 
      else if(j.next()=="C"){ 
       c++; 
      } 
      else if(j.next()=="G"){ 
       g++; 
      } 
      else if(j.next()=="T"){ 
       t++; 
      } 
      else{ 
       System.out.println("A count: " + a); 
       System.out.println("C count: " + c); 
       System.out.println("G count: " + g); 
       System.out.println("T count: " + t); 
       break; 
       } 
     } 

    } 
} 
+0

возможно дубликат [? Как сравнить строки в Java] (http://stackoverflow.com/questions/513832/how- do-i-compare-strings-in-java) –

+0

Да, вы хотите использовать метод .equals – ZekeDroid

+2

Зарезервируйте результат 'j.next()' в некоторой переменной, а затем проверьте его значение. – raina77ow

ответ

2

Как уже было написано, вы должны поместить свой следующий элемент в локальную переменную.

Этого недостаточно: никогда не используйте == для сравнения строк. Используйте метод String equals вместо или даже equalsIgnoreCase.

Вы должны использовать что-то вроде:

String val = j.next(); 
if(val.equals("A")){ // you could use val.equalsIgnoreCase("A") to be case insensitive 
    ... 
} else if (val.equals("B")){ 
    ... 

Как было предложено в ответ aljipa, вы использовать переключатель. Если вы хотите, чтобы ваш тест, чтобы быть чувствительны к регистру может, также может написать что-то вроде:

String val = j.next(); 
switch (val.toUpperCase()) { 
    case "A": 
     a++; 
     break; 
    case "B": 
     ... 
+0

В Java 7 вы также можете использовать оператор switch. –

+0

Согласен. Он уже использовался в другом ответе. –

+0

В любом случае, это не повредит, так что ваш ответ будет стоять отдельно. Как правило, то, что я делаю, добавляя дополнительную информацию, - это признание человека в ответе (так как они * сделали его первым). –

2

Поместите его в локальную переменную.

String next = j.next(); 

и использовать это в ваших операторах if. В противном случае вы будете продвигать итератор в каждой проверке.

Вот что он должен выглядеть следующим образом:

public static void process(Scanner j, String input){ 
    int a = 0, c = 0, g = 0, t = 0; 

    while(j.hasNext()){ 
     String n = j.next(); 
     if (n.equals("A")){ 
      a++; 
     } 
     else if(n.equals("C")){ 
      c++; 
     } 
     else if(n.equals("G")){ 
      g++; 
     } 
     else if(n.equals("T")){ 
      t++; 
     } 
     else{ 
      ... 
     } 
    } 

} 

Plus, не использовать == для сравнения строк. Оператор == проверяет, является ли он одним и тем же экземпляром объекта, но не является ли контент равным. Вместо этого используйте метод equals.

+2

Использование '==' для сравнения строк - это плохая идея, потому что вы просто сравниваете ссылки, а не значение самой строки! –

+0

да, вы, конечно, правы! не смотрел на это. Я редактировал свой образец. – kmera

0

j.next() на итераторе по существу переходит к следующему циклу, поэтому вы делаете 4 цикла в каждом цикле. Ответ

1

K-MERA является правильным, но считают, с помощью переключателя, так как это бессимптомно более эффективным:

public static void process(Scanner j, String input) { 
int a = 0, c = 0, g = 0, t = 0; 
String ch; 
while(j.hasNext()) { 
    switch(ch = j.next()) { 
     case "A": 
       a++; 
       break; 
    case "C": 
      c++; 
      break; 
    case "G": 
      g++; 
      break; 
    case "T": 
      t++; 
      break; 
     default: 
       System.out.println("A count: " + a); 
       System.out.println("C count: " + c); 
       System.out.println("G count: " + g); 
       System.out.println("T count: " + t); 
       return; 
     } 
    } 
} 

Кроме того, я бы предпочел использовать простой (полукокс) System.in.read(), если вам нужно прочитать char по char нет необходимости в загрязнении вашей кучи избыточными экземплярами String, что является именно тем, что Scanner.next() делает , если только вы не вносите входной сигнал обычным способом.

+0

Нет, как было написано, ответ k-mera был неправильным, но ваш ... (только в Java 7)! Кроме того, это более читаемо. –

+0

Ух, кажется, он уже отредактировал, и я не заметил. Я думаю, что читаемость не так важна, как более асимптоматически более быстрый алгоритм, некоторые сомневаются, что коммутатор с большим количеством перерывов более читабельен. Что касается Java 7, сканера там не было, пока Java 5 тоже :) – aljipa

+0

Я написал комментарий к его ответу. –

Смежные вопросы