1

さて、次のように機能するメソッドcomplementWC()を作成するように求められます。

public String complementWC()

ワトソンクリックの補体を返します。これは、相補DNA鎖(つまり、二重らせんのもう一方の鎖)を表す文字列です。したがって、すべてのTをAに、すべてのAをTに、すべてのCをGに、すべてのGをCに交換します。

そして、これは私が何とかしたことです:

private String dna;

    public String complementWC(){
        String dnaWC = "";
        for(int i=0;i<dna.length();i++){
            if(dna.charAt(i) == 'T'){
                dna.replace(dna.charAt(i), 'A');
            }
            if(dna.charAt(i) == 'A'){
                dna.replace(dna.charAt(i), 'T');
            }
            if(dna.charAt(i) == 'C'){
                dna.replace(dna.charAt(i), 'G');
            }
            if(dna.charAt(i) == 'G'){
                dna.replace(dna.charAt(i), 'C');
            }   
            dnaWC = dna;
        }
        return dnaWC;
    }

ここで問題となるのは、このメソッドがWCcomplementではなく元のDNAを返すだけであるということです。そのため、forループ内の文字列を「dnaWC」という新しい文字列に格納する方法がわかりません。

4

3 に答える 3

5

文字列は不変です。を呼び出すとreplace、元の文字列は変更されずに新しい文字列が返され、返された文字列はすぐに無視されます。それが、元の文字列が変更されなかった理由です。

を使用して新しい文字列をStringBuilder作成できます。これにより、新しい文字列が 1 つだけ作成されるため、文字が置換されるたびに新しい文字列を作成するオーバーヘッドが節約されます。

public String complementWC(){
    StringBuilder builder = new StringBuilder();
    for(int i=0;i<dna.length();i++){
        char c = dna.charAt(i);
        if(dna.charAt(i) == 'T'){
            builder.append('A');
        }
        if(dna.charAt(i) == 'A'){
            builder.append('T');
        }
        if(dna.charAt(i) == 'C'){
            builder.append('G');
        }
        if(dna.charAt(i) == 'G'){
            builder.append('T');
        }   
    }
    return builder.toString();
}
于 2013-02-28T18:52:16.497 に答える