0

したがって、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

4 に答える 4

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":
        ...
于 2014-01-19T18:30:16.810 に答える
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代わりにメソッドを使用してください。

于 2014-01-19T18:23:06.180 に答える
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;
         }
     }
}

さらに、単純な ( char ) System.in.read() を使用したいのですが、char ごとに読み取る必要がある場合は、冗長な String インスタンスでヒープを汚染する必要はありませ。入力を独自の方法でトークン化します。

于 2014-01-19T18:30:09.370 に答える
0

イテレータの j.next() は基本的に次のループに進むため、ループごとに 4 つのループを作成しています。

于 2014-01-19T18:24:14.997 に答える