2016-03-29 7 views
1

Also, während ich diese Frage eintippte, fand ich einen Workaround für einen Fehler "fehlende Return-Anweisung". Aber ich denke immer noch nicht, dass dies der richtige Weg ist. Wie Sie sehen können, habe ich einige verschachtelte if-Anweisungen. Ich möchte, dass beide Bedingungen erfüllt sind, bevor Sie etwas zurückgeben, aber ich musste die Return-Anweisungen außerhalb der verschachtelten if-Anweisungen platzieren. Wenn die letzte Bedingung nicht erfüllt ist, sollte dies viele Probleme verursachen, da eine leere Zeichenfolge zurückgegeben wird, aber ich habe das Gefühl, dass dies nicht der beste Weg ist, Dinge zu tun.Wie kann ich diesen Code optimieren (return statements)?

1. Edit: mit meinem aktuellen Update, ich vermisse immer noch eine return-Anweisung. Ich könnte die gleiche Reparatur machen, aber ich habe das Gefühl, dass es unpassend ist.

public String findProtein(String dna) { 
int start = dna.indexOf("atg"); 

int stop1 = dna.indexOf("tag", start + 3); 
int stop2 = dna.indexOf("tga", start + 3); 
int stop3 = dna.indexOf("taa", start + 3); 

String subStr1 = dna.substring(start, stop1); 
String subStr2 = dna.substring(start, stop2); 
String subStr3 = dna.substring(start, stop3); 

boolean geneFound = false; 

if (subStr1.length() % 3 == 0) { 
    geneFound = true; 
    return subStr1; 
} 

if (geneFound == false) { 
    if (subStr2.length() % 3 == 0) { 
      geneFound = true; 
     } 
     return subStr2; 
    } 

    if (geneFound == false) { 
     if (subStr3.length() % 3 == 0) { 
      geneFound = true; 
     } 
     return subStr3; 
    } 

    if (geneFound == false) { 
     return ""; 
    } 
} 

2. Edit: Zusatzcode

private void stopCodon(String gene){ 
    //This prints out the last 3 characters of the gene 

    String stopCodon = gene.substring(gene.length() - 3); 
    System.out.println(stopCodon); 
} 

public void testing() { 
    String a = "ataaactatgttttaaatgt"; 

    String result = findProtein(a); 

    stopCodon(result);   
} 
+0

Wenn die Methode sagt es ein 'String' kehrt dann alle möglichen Pfade durch das * müssen * Methode zurückgeben' String'. Das kommt nicht herum. (Sie können 'null' zurückgeben, wenn Sie möchten, aber Sie müssen etwas zurückgeben). –

Antwort

0
if(subStr1.length() % 3 ==0){ 
     geneFound = true; 
     result = subStr1; 

    }else if(geneFound == false){ 
     if(subStr2.length()% 3 ==0){ 
      geneFound = true; 
     } 
     result = subStr2; 
    }else if(geneFound == false) 
     if(subStr3.length()% 3 ==0){ 
      geneFound = true; 
     } 
     result = subStr3; 
    } 

    if (geneFound == false){ 
     result = ""; 
    } 
return result; 

Ergebnis ist vom Typ String.

Jede der drei if-Anweisungen gibt jedoch den Wert zurück. Wenn nicht vierter if-Anweisung wird der Wert zurückgegeben.

Sie können das Ergebnis einer Variablen zuweisen und es am Ende zurückkehren

0

Da Sie einen Wert zurückgeben und die boolean ist eine lokale Variable, es ist nicht wirklich wichtig, wenn Sie den Booleschen Wert zu ändern oder nicht in dieser Code. Ich sehe wirklich keinen Nutzen dafür. Ich habe den Code vereinfacht, der Ihrer Logik folgt!

public String findProtein(String dna) { 

    int start = dna.indexOf("atg"); 
    int stop1 = dna.indexOf("tag", start+3); 
    int stop2 = dna.indexOf("tga",start+3); 
    int stop3 = dna.indexOf("taa",start+3); 


    String subStr1 = dna.substring(start,stop1); 
    String subStr2 = dna.substring(start,stop2); 
    String subStr3 = dna.substring(start,stop3); 

    if(subStr1.length() % 3 == 0) { 
     return subStr1; 
    } 

    if(subStr2.length() % 3 == 0){ 
     return subStr2; 
    } 

    if(subStr3.length()% 3 ==0){ 
     return subStr3; 
    } 

    return ""; 

}

0

Warum Sie nicht so etwas wie diese Rückkehr?

public String findProtein(String dna) { 

    String valueToBeReturned = ""; 
    if(condition 1){ 
      valueToBeReturned = "value1" 
     } 

    if(condition 2){ 
      valueToBeReturned = "value2" 
     } 

    //Rest of the conditions 

    return valueToBeReturned; //Finally return the specific value 
    } 
1

Wenn es nach mir ginge, würde ich die folgende Logik

if(subStr1.length() % 3 ==0){ 
    geneFound = true; 
    return subStr1; 
} 

if(geneFound == false){ 
    if(subStr2.length()% 3 ==0){ 
     geneFound = true; 
    }return subStr2; 
} 

if(geneFound == false){ 
    if(subStr3.length()% 3 ==0){ 
     geneFound = true; 
    } 
    return subStr3; 
} 
if (geneFound == false){ 
    return ""; 
} 

Um die folgenden mit else if Aussagen bearbeiten:

if(subStr1.length() % 3 ==0){ 
    return subStr1; 
} else if (substr2.length()%3==0){ 
    return substr2; 
} else if (substr3.length()%3 == 0) { 
    return substr3; 
} else { 
    return null; 
} 

Ich bin auch nicht sicher, ob String subStr1 = dna.substring(start,stop1); etwas Sie wollen, da eine Ausnahme ausgelöst wird, wenn das Stopcodon nicht existiert, aber es wäre schwer zu beurteilen, ohne dass Sie uns zusätzliche Informationen geben.

Added

Art der Säge dies kommt, aber wenn man sich die Beschreibung sucht indexOf

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int)

der Index des ersten Auftretens des Zeichens in der Zeichenfolge dargestellt durch dieses Objekt, oder -1, wenn das Zeichen nicht auftritt.

Wenn Sie überprüfen wollen, ob die Teil vorhanden ist, prüfen Sie, ob der Index -1

Ich bin nur werde für die erste Teilkette ein Beispiel durch

int stop1 = dna.indexOf("tag", start + 3); 
if(stop != -1) { 
    return dna.substring(start, stop1); 
} 

Sie sollten Beginnen Sie mit der Überprüfung, ob das Startcodon überhaupt existiert, und geben Sie null zurück, wenn es nicht sofort existiert, da Positionen von Stoppcodons ohne Startcodons nutzlos sind.

Hoffentlich hilft

+0

Sie würden "geneFound" überhaupt nicht loswerden, da es nie gelesen wird? – erickson

+0

Ich dachte, vielleicht ist es eine interne Variable, die später verwendet werden kann O_o - eigentlich hast du recht, es ist in der Funktion deklariert. Sollte das auch loswerden – jrhee17

+0

Es ist eine lokale in der ursprünglichen – erickson

0

Wie wäre es unnötig Codeblock zu entfernen?

if (geneFound == false) { zurück ""; }

Verwandte Themen