2017-11-19 9 views
1

開始コドンatgと3つの終了コドンtga、taa、およびtagのうちの1つの間のすべてを印刷する必要があります。私は数日の間この問題を解決しようとしてきましたが、終わりに印刷されるものから開始コドンを取り除く方法を見つけることができないようです。EX:私のコードを使用するとATGAAAが印刷されますがAAAだけを印刷する必要があります。最終的なprintlnから開始コドンを削除する

public class GeneFinderYang { 



     public static int findStopIndex(String dna, int index){ 
      int stop1 = dna.indexOf("tga", index); 
      if (stop1 == -1 || (stop1 - index) % 3 != 0) { 
       stop1 = dna.length();  
      } 
      int stop2 = dna.indexOf("taa", index); 
      if (stop2 == -1 || (stop2 - index) % 3 != 0) { 
       stop2 = dna.length();  
      } 
      int stop3 = dna.indexOf("tag", index); 
      if (stop3 == -1 || (stop3 - index) % 3 != 0) { 
       stop3 = dna.length();  
      } 
      return Math.min(stop1, Math.min(stop2,stop3)); 
     } 


     public static void printAll(String dna){ 
      String dnaLow = dna.toLowerCase(); 
      int start = 0; 
      while (true) { 
       int loc = dnaLow.indexOf("atg", start); 

       int stop = findStopIndex(dnaLow, loc+3); 
       if (stop != dna.length()) { 
        System.out.println(dna.substring(loc, stop)); 
        start = stop + 3; 
       } else { 
        start = start + 3; 
       }  
      } 
     } 

     // demo 
     public static void testFinder() { 

      String dna1 = "ATGAAATGAAAA"; 
      System.out.println("DNA string is: \n" +dna1); 
      System.out.println("Genes found are:"); 
      printAll(dna1); 
      System.out.print("\n"); 


     } 

     public static void main(String[] args) { 
      testFinder(); 
     } 
    } 
+0

「私たちは、ATG開始コドンおよび3つのエンドコドンTGA、TAA、とタグの間のすべてをプリントアウトする必要がある」 - それはあなたが何をしたいのか私にははっきりしていない、あなたの要件を明確にしてください。例が役に立ちます。 – alfasin

答えて

0

エラーは、printAll()関数にあります。

public static void printAll(String dna){ 
    String dnaLow = dna.toLowerCase(); 
    int start = 0; 
    while (true) { 
     int loc = dnaLow.indexOf("atg", start); 

     int stop = findStopIndex(dnaLow, loc+3); 
     if (stop != dna.length()) { 
      System.out.println(dna.substring(loc, stop)); 
      start = stop + 3; 
     } else { 
      start = start + 3; 
     }  
    } 
} 

ここでの主な問題は、あまりにも多くの変数を使用していることです。 loc変数だけでなく、開始変数が必要です。私たちはLOCのすべての出現を切り替え、醜い算術を取り除く場合、関数は次のようになります。

public static void printAll(String dna){ 
    String dnaLow = dna.toLowerCase(); 
    int start = 0; 
    while (true) { 
     start = dnaLow.indexOf("atg", start) + 3; 
     int stop = findStopIndex(dnaLow, start); 
     if (stop != dna.length()) { 
      System.out.println(dna.substring(start, stop)); 
      start = stop + 3; 
     } else { 
      start = start + 3; 
     } 
    } 
} 

しかし、我々は行われません。このようにコードを実行すると、現在のコードと同じように動作します。 indexOf()関数は、文字列の先頭のインデックスを返します。だから、あなたがATGのインデックスを見つけたら、それはゼロを返します。まあ、atgは3文字の長さなので、必要な文字列はインデックス3から始まります。これは結果に3を加えることで簡単に解決されます。 if文が失敗したときだけでなく、毎回これを行う必要があります。これが複数の遺伝子を出力することになっている場合は、コードを少し、好ましくは無限ループから外して再構築してみてください。主な問題は、ifステートメントで、文字列の最後にあるかどうかを確認してからstartをstop + 3に設定することです。しかし、ループは再び実行され、atgのインデックスに再び設定されます。これは、明らかにloc変数を切り捨てる症状です。

public static void printAll(String dna) { 
    String dnaLow = dna.toLowerCase(); 
    int start = 0; 
    int stop = 0; 
    start = dnaLow.indexOf("atg", start) + 3; 
    while (start < dna.length()) 
    { 
     stop = findStopIndex(dnaLow, start); 
     System.out.println(dna.substring(start, stop)); 
     start = stop + 3; 
    } 
} 

私はループの外側で停止変数を初期化しましたが、それは個人的な好みであり、問​​題ではありません。

編集: forループは、複数のアイテムを扱うときにあなたの友人です。これはfindStopIndex()関数で明らかです。この関数は、実際にはforループで書く方が簡単です。コドンとインデックスを保持する配列を作成し、コドンあたり1つのインデックスがあるようにします。次に、それらを繰り返して、それぞれについてストップインデックスを見つけようとします。見つからなければ、対応するインデックスを文字列の最後に設定します。

public static int findStopIndex(String dna, int index){ 
    String endCodons[] = { "tga", "taa", "tag"}; 
    int stopIndexes[] = new int[3]; 
    for(int i = 0; i<3 ;i++) 
    { 
     stopIndexes[i] = dna.indexOf(endCodons[i], index); 
     if(stopIndexes[i]==-1||(stopIndexes[i] - index) % 3 != 0) 
      stopIndexes[i] = dna.length(); 
    } 
    return Math.min(stopIndexes[0], Math.min(stopIndexes[1],stopIndexes[2])); 
} 
+0

ハードコードされた番号3を「atg」.length'に置き換えて、これをもっと明確にすることをお勧めします。さらに、 "atg"を変数に抽出して変更しやすくします。 – Hulk

+0

理解しやすいですが、パフォーマンスとハードコーディングされた数字の疑いがあります。 –

+1

パフォーマンスの差はごくわずかです。部分文字列の作成と比較して、いくつかの変数の読み込みはまったく重要ではありません。 'println'はこのプログラムのもっとも遅い部分です。 – Hulk

関連する問題