2017-03-06 121 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;

使用另一個變量來存儲結果。

相關問題