【问题标题】:How can I optimize this code (return statements)?如何优化此代码(返回语句)?
【发布时间】:2016-03-29 03:55:40
【问题描述】:

因此,当我输入此问题时,我发现了“缺少返回语句”错误的解决方法。但我仍然认为这不是正确的做法。如您所见,我有一些嵌套的 if 语句。我希望在返回任何东西之前满足这两个条件,但是我必须将返回语句放在嵌套的 if 语句之外。如果不满足最后一个条件,这应该会导致很多问题,因为将返回一个空字符串,但我只是觉得这不是做事的最佳方式。

第一次编辑:在我当前的更新中,我仍然缺少退货声明。我可以做与我应用的相同的修复,但我觉得它好像是不合适的。

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 "";
    }
}

第二次编辑:附加代码

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);         
}

【问题讨论】:

  • 如果方法说它返回一个String,那么通过该方法的所有可能路径必须返回一个String。没有办法解决这个问题。 (如果你愿意,你可以返回null,但你必须返回一些东西)。

标签: java return


【解决方案1】:

如果是我,我会编辑以下逻辑

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 "";
}

以下使用else if 语句:

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;
}

我也不确定String subStr1 = dna.substring(start,stop1); 是否是您想要的,因为如果终止密码子不存在,则会引发异常,但如果您不提供其他信息,将很难判断。

已添加

有点看到这一点,但如果你看一下 indexOf 的描述

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

该字符在此对象表示的字符序列中第一次出现的索引,如果该字符没有出现,则为 -1。

如果要检查子字符串是否存在,则检查索引是否为-1

我只介绍第一个子字符串的示例

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

您应该首先检查起始密码子是否存在,如果不存在则立即返回 null,因为没有起始密码子,终止密码子的位置是无用的。

希望这会有所帮助

【讨论】:

  • 你不会完全摆脱geneFound,因为它从未被阅读过?
  • 我在想也许它是一个内部变量,以后可能会使用 O_o - 实际上你是对的,它是在函数中声明的。也应该摆脱它
  • 原文中声明为本地
  • 所以我用你的修改了我的代码(减去布尔值),现在它说索引超出范围-8。关于 subStr1 我不知道我哪里出错了,我更新了我的代码以显示哪里
【解决方案2】:
  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;

结果是字符串类型。

但是,三个 if 语句中的任何一个都将返回该值。如果不是第四个 if 语句将返回该值。

您可以将结果分配给一个变量并在最后返回它

【讨论】:

    【解决方案3】:

    为什么不返回这样的东西?

     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
       }
    

    【讨论】:

      【解决方案4】:

      删除不必要的代码块怎么样?

      if (geneFound == false) { 返回 ””; }

      【讨论】:

        【解决方案5】:

        由于您返回一个值并且布尔值是一个局部变量,因此在此代码中是否更改布尔值并不重要。我当时真的看不出它有什么用。我按照你的逻辑简化了代码!

        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 "";
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-02
          • 1970-01-01
          相关资源
          最近更新 更多