2017-05-14 2 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)이 범위를 벗어난 인덱스를 참조하기 때문에 str = "x"가 첫 번째 if 문 다음에 실패하지 않을까요? (str = "x"의 최대 인덱스는 0입니다)?

답변

3

문은 STR = str.substring는 (1)을 참조하기 때문에 경우 STR은 = "X"최초의 후 실패 할 경우 그렇지 않을까요 범위를 벗어난 인덱스 (str = "x"의 최대 인덱스는 0)? 이 범위를 벗어 아니기 때문에

아니, : substring의 첫 번째 (그리고 두 번째) 매개 변수뿐만 아니라 length() - 1 문자열의 length()에 아무것도까지 될 수 있습니다. From the Javadoc :

IndexOutOfBoundsException [예외] - beginIndex가 음수 또는 String 객체의 길이보다 큰 경우 .

그 값은 크거나 크지 않습니다. 당신은 단순히 문자열/시작 x로 끝나는 여부를 확인하고 있다는 점이다

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

이 쉽게 이유;로


이 될 쉽게 (그리고보다 효율적인)이를 작성하는 것 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

관련 문제