2017-05-14 14 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; 
} 

は、なぜこれが "STR = X" 空の文字列( ")" を返すのですか? str = str.substring(1)が範囲外のインデックスを参照しているため(最初のifステートメントの後でstr = "x"の最大インデックスが0)、str = "x"が失敗することはありませんか?

答えて

3

場合ときSTR = if文STR = str.substringは、(1)参照しているため、 "x" は最初の後に失敗しません範囲外のインデックス(str = "x"の最大インデックスは0)?

いいえ、それは範囲外ではありませんので:substringの第1(および第2)のパラメータは、文字列だけでなく、length() - 1length()には何もアップすることができます。 From the Javadoc

IndexOutOfBoundsExceptionを[例外] - beginIndexが負であるかこのStringオブジェクトの長さよりも大きい場合

これはそれ以上で、それ以上ではありません。


これは、としてこれを書くことが容易(かつ効率的)のようになります。

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 typo。一定。 –

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

関連する問題