所以我很确定我正在使用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;
}
}
}
}
答案 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次循环。