2017-05-14 163 views
-1

假設我有一個叫做withoutX的方法,當給定一個字符串時,如果它們是x,則刪除該字符串的第一個和最後一個字母。爲什麼執行此代碼?

我的代碼是:

public String withoutX(String str) { 
    if(str.length()>0 && str.substring(0,1).equals("x")) { 
    str = str.substring(1); 
    } 
    if(str.length()>0 && str.substring(str.length()-1).equals("x")) { 
    str = str.substring(0,str.length()-1); 
    } 
    return str; 
} 

爲什麼這個返回空字符串( 「」)時,海峽= 「X」?當str =「x」在第一個if語句之後失敗時不會出現這種情況,因爲str = str.substring(1)引用了超出邊界的索引(str =「x」的最大索引爲0)?

回答

3

豈不情況下,當海峽=「X」後的第一次失敗,如果語句,因爲海峽= str.substring(1)引用了一個超出邊界的索引(str =「x」的最大索引是0)?

沒有,因爲它不是出界:的substring第一(和第二)參數可以是任何東西字符串的length(),不只是length() - 1From the Javadoc

[拋出] IndexOutOfBoundsException - 如果beginIndex爲負或大於此字符串對象的長度大。

這大於,不大於或等於。


它會更容易(和更有效)到寫爲:

int start = str.startsWith("x") ? 1 : 0; 
int end = str.length() - (str.endsWith("x") && start < str.length() ? 1 : 0); 
return str.substring(start, end); 

更容易的原因是,你只是簡單的檢查字符串是否啓動/與x結束; String提供了一些方法來做到這一點,而不是首先構造一個子串。

它更高效的原因是它不會創建中間子字符串。

+0

'str == 0'? – Andreas

+0

另外,'? :'具有最低優先級(除了'=')優先級,所以永遠不需要爲條件加上括號,但通常需要將括號括起來。 :'構造,即你需要'str.length() - (str.endsWith(「x」)?1:0)'。 – Andreas

+0

@Andreas錯字。固定。 –

0

讓我們走一步看透徹代碼步:

//str = "x" 
if(str.length()>0 && str.substring(0,1).equals("x")) { // both true 
    str = str.substring(1); 
    //now: str = "" 
} 
if(str.length()>0 && str.substring(str.length()-1).equals("x")) { // str.length == 0. 
    //Since && does not evaluate the second parameter, everything is fine and if doesn't get called 
} 
return ""; //as str = "" 
+0

OP詢問爲什麼'str = str.substring(1)'沒有失敗。你沒有回答這個問題。 – Andreas