2014-09-15 8 views
-1

codingBat 연습을 사용하여 내 자신 만의 오락을위한 재귀 연습.자바에서 equals()와 startsWith() 사이의 차이

문자열이 주어지면 문자열에 소문자 "hi"가 나타나는 횟수를 재귀 적으로 계산하지만 im 앞에 "x"가있는 "hi"는 계산하지 않습니다.

countHi2("ahixhi") → 1 
countHi2("ahibhi") → 2 
countHi2("xhixhi") → 0 

는이 코드를하려고 노력하지만 경계 예외 밖으로 던지기 유지 : 나는 문자열을 변경

public int countHi2(String str){  
    if(str.length()<2){ 
     return 0; 
    } 
    else if(str.substring(0,3).equals("xhi")){ 
     return countHi2(str.substring(3)); 
    } 
    else if(str.substring(0,2).equals("hi")){ 
     return 1+countHi2(str.substring(2)); 
    } 
    else{ 
     return countHi2(str.substring(1)); 
    } 
} 

()와 startsWith() 지금

else if(str.startsWith("xhi")){ 
      return countHi2(str.substring(3)); 

과 동일 완벽하게 작동합니다, 왜 누군가가 제 첫 번째 코드가 올바르지 않았는지 지적 해 주실 수 있습니까? startsWith()와 equals() 사이에 차이가 있습니까?

+8

귀하의 이름이''사용자 ''로 시작합니까? ''notuser ''와 같은가요? –

+1

하위 문자열 (0, 3)을 수행하기 전에 문자열의 문자가 3 자 이상이어야합니다. 바로 startsWith가 코드를 작성하지 않는다는 것입니다. 예외의 스택 추적을 읽은 경우 예외가 equals()가 아닌 substring()에 의해 throw되었음을 알 수 있습니다. 예외 스택 추적은 예외가 발생하는 코드 줄을 알려줍니다. 스택 추적을 읽지 않는 것이 가장 큰 실수입니다. –

+0

당신이 정말로 지정하지 않았기 때문에 물어볼 것입니다.'equals 또는 startsWith'를 사용해야합니까, 아니면'contains contains '같은 것이 있습니다. 왜냐하면 contains가 다른 예제를 위해 좀 더 쉽고 견고 할 것이라고 말하기 때문입니다 문자열의; 이 구현은 테스트 문자열이 항상 패턴 * hi * hi 등으로 가정하는 것으로 보입니다. – Culyx

답변

6

먼저 문자열에 적어도 2 자의 문자가 있는지 확인한 다음 첫 번째 세 개의 문자가 xhi 인 지 테스트합니다. String.substr은 문자열이 충분히 길지 않은 경우 예외를 throw합니다.

String.startsWith에는이 문제가 없지만 2 문자 문자열이 3 문자로 시작하는지 여부를 확인하면 예외가 발생하지 않으며 단지 false을 반환합니다.