2017-03-06 222 views
-5
import java.util.Scanner; 
public class DNA{ 
    public static void main(String [] args) { 

    Scanner scan = new Scanner(System.in); 
    System.out.println("What is the dna string?"); 
    StringBuilder DNA = new StringBuilder(scan.nextLine()); 
    DNA.append(scan.nextLine()); 
    for(int i=0;i<DNA.length();i++){ 
     if(DNA.charAt(i)=='A'){ 
     DNA.setCharAt(i,'T'); 
     } 
     if(DNA.charAt(i)=='T'){ 
     DNA.setCharAt(i,'A'); 
     } 
     if(DNA.charAt(i)=='G'){ 
     DNA.setCharAt(i,'C'); 
     } 
     if(DNA.charAt(i)=='C'){ 
     DNA.setCharAt(i,'G'); 
     } 
     } 
    System.out.println(DNA); 
     } 
    } 

所以,这就是我的代码现在。它是一个基本的程序,需要一个DNA链,并给出它的副本。但是,某些字母可以工作,而其他字母则可以。从T到A和C到G的转换工作,但从A到T和从G到C的转换不能。有人可以帮我吗?东西我的代码,我似乎无法弄清楚

+1

您正在使用来自Scanner的输入创建一个StringBuilder,然后再将它附加到StringBuilder。另外一个switch语句会更好 – jthort

+2

使用调试器来遍历代码。应该花费大约两秒时间来发现问题。 –

+0

使用'else if's来防止下一个逆转交换。 – shmosel

回答

0

你最终将从A转换为T,然后将它从T转换回A以获得相同的迭代(字符)。使用continue不符合下一个条件。 -

for (int i = 0; i < DNA.length(); i++) { 
    if (DNA.charAt(i) == 'A') { 
     DNA.setCharAt(i, 'T'); 
     continue; 
    } 
    if (DNA.charAt(i) == 'T') { 
     DNA.setCharAt(i, 'A'); 
     continue; 
    } 
    if (DNA.charAt(i) == 'G') { 
     DNA.setCharAt(i, 'C'); 
     continue; 
    } 
    if (DNA.charAt(i) == 'C') { 
     DNA.setCharAt(i, 'G'); 
     continue; 
    } 
} 

这将产生如下输出 -

What is the dna string? 
ATGC 

TACG 

在一个侧面说明,你可以摆脱多余DNA.append(scan.nextLine());的循环之前也是如此。

2

使用else if语句使其仅切换一次字符。因为稍后可能会在for循环的末尾放置其他逻辑,所以最好继续声明。

for (int i=0;i<DNA.length();i++) { 

     if (DNA.charAt(i)=='A'){ 

      DNA.setCharAt(i,'T'); 

     } else if (DNA.charAt(i)=='T'){ 

      DNA.setCharAt(i,'A'); 

     } else if (DNA.charAt(i)=='G'){ 

      DNA.setCharAt(i,'C'); 

     } else if (DNA.charAt(i)=='C'){ 

      DNA.setCharAt(i,'G'); 

     } 
    } 
0

您是从在第一if语句替换值T,然后在第二if声明你又改变其从T到A.同样的事情,你这样做是为了克至C.

简单的事情修复后DNA.setCharAt(i,'YOUR_CHARS');

使用else if的第二,第三和第四if语句只是增加break;

使用另一个变量来存储结果。

相关问题