【问题标题】:Using next() in the parameter of if/else statement在 if/else 语句的参数中使用 next()
【发布时间】:2014-02-08 20:07:50
【问题描述】:

所以我很确定我错误地使用了 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;
                }
         }

    }
}

【问题讨论】:

  • 是的,你想使用 .equals 方法
  • j.next()的结果缓存在某个变量中,然后检查其值。
  • @DennisMeng 不是重复的,但有用的链接。
  • 另外,是的,j.next() 将删除一个元素,所以在这里您将在每个循环中删除 4 个元素,以查看它们是否相等

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


【解决方案1】:

如前所述,您必须将下一个元素放入局部变量中。

但这还不够:请不要使用== 来比较字符串。使用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":
        ...

【讨论】:

  • 在 Java 7 中,您也可以使用 switch 语句。
  • 无论如何添加它都没有坏处(这样你的答案就独立了)。一般来说,当我添加额外信息时,我所做的就是承认答案中的人(因为他们确实首先提出了它)。
【解决方案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 方法。

【讨论】:

  • 使用== 比较字符串是个坏主意,因为您只比较引用,而不是字符串本身的值!
  • 是的,你当然是对的!没看那个。我编辑了我的示例。
【解决方案3】:

k-mera 的回答是正确的,但考虑使用 switch,因为它在无症状方面更有效:

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

此外,如果您需要逐个字符地读取字符,我宁愿使用简单的 (char) System.in.read(),不需要用多余的 String 实例污染堆,这正是 Scanner.next() 所做的strong>除非您不以自定义方式标记输入。

【讨论】:

  • 不,正如它所写的那样,k-mera 的答案是不正确的,但你的答案是......(但仅在 Java 7 中)!此外,它更具可读性。
  • 呃,他好像已经编辑过了,我没注意到。我认为可读性不如无症状更快的算法重要,有些人会怀疑有很多中断的开关更具可读性。至于 Java 7,Scanner 直到 Java 5 才出现:)
  • 我对他的回答发表了评论。
【解决方案4】:

迭代器上的 j.next() 基本上会进入下一个循环,因此您在每个循环上进行 4 个循环。

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 2020-11-20
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多