在if / else语句的参数中使用next()

时间:2014-01-19 18:20:37

标签: java java.util.scanner next dna-sequence

所以我很确定我正在使用next和hasNext错误...我试图输入一串ACGT字符,然后计算单个结果字母。提前谢谢。

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

    }
}

4 个答案:

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

}

另外,不要使用==来比较字符串。 ==运算符将检查它是否是相同的对象实例,但不检查内容是否相等。请改用equals方法。

答案 1 :(得分: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":
        ...

答案 2 :(得分: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;
         }
     }
}

另外我宁愿使用simple(char)System.in.read()如果需要通过char读取char,则不需要使用冗余的String实例来污染堆,这正是Scanner.next()所做的< strong> 除非 您没有以自定义方式标记输入。

答案 3 :(得分:0)

迭代器上的j.next()将基本上继续进行下一个循环,因此你在每个循环上进行4次循环。