2016-01-22 52 views
0

我正在CodingBat中嘗試練習。較少重複的代碼或高效但重複的代碼之間的選擇

Java> String-1> seeColor: 給定一個字符串,如果字符串以「red」或「blue」開頭,則返回該顏色字符串,否則返回空字符串。

我運行的代碼是:

public String seeColor(String str) { 
    int len = str.length(); 

    if (len >= 3 && str.substring(0, 3).equals("red")) { 
    return str.substring(0, 3); 
    } else if (len >= 4 && str.substring(0, 4).equals("blue")) { 
    return str.substring(0, 4); 
    } 
    return ""; 

} 

但我發現這個答案的其他所有網站上:

public String seeColor(String str) { 
    int len = str.length(); 

    if(len >= 4) { 
     if(str.substring(0, 4).equals("blue")) 
      return "blue"; 
     else if(str.substring(0, 3).equals("red")) 
      return "red"; 
     else 
      return ""; 
    } 

    else if(len == 3) { 
     if(str.substring(0, 3).equals("red")) 
      return "red"; 
     else 
      return ""; 
    } 

    else 
     return ""; 
} 

我的解決方案具有更少的重複代碼(或者它是什麼,我認爲)。 但另一種解決方案看起來更有效率。它從大字符串開始,並且只評估長度爲3個字符的字符串。也許這最後的解決方案更能夠在未來進行簡單的更改。 我想閱讀某人的意見。謝謝。

編輯:我添加了一個道歉,我沒有按照@MikeDunlavey的建議,適當地格式化我的代碼。

回答

6

我也不會這樣做。我不會認爲第二個效率更高,但它更復雜。兩者都不必要地創建對象。

public String seeColor(String str) { 
    return str.startsWith("red") ? "red" : 
      str.startsWith("blue")? "blue" : ""; 
} 

每次調用substring這個時間創建了兩個對象是什麼這個功能做得非常昂貴。

+0

是的,這是一個臭名昭着的改進。我會記住避免對象重複,並尋找像startsWith這樣的其他方法。謝謝你的回答,這是我的第一個問題。 – EMER

+0

@EMER:還要注意Peter的答案是仔細格式化的,既可以用於縮進,也可以查看內容和間距,因此相關的內容直接在上面和下面。有經驗的程序員知道,當看到代碼是否正確或需要更改代碼時,對細節的關注確實有幫助。 –

+0

@MikeDunlavey謝謝,我解決了。這是一個有意識的錯誤,我不確定它在這個站點的代碼塊是如何工作的。但我不知道在哪裏削減長篇大論,我發現你的建議是將相關的事情放在上面和下面,對他們非常有幫助。 – EMER