2016-10-16 4 views
1

여기에서이 문제에 대한 해결책을 보았지만 인원 코드는 내 것과 다릅니다. 나는 내가 뭘 잘못하고 있는지 알고 싶다. 나는 프로그래밍에 익숙하지 않고 좋은 일이 절실합니다.문자열에서 지정된 문자의 발생 횟수를 찾는 재귀

질문 : (문자열에서 지정된 문자의 발생 수) 다음 헤더 사용하여 문자열에서 지정된 문자의 발생 횟수 발견 재귀 방법을 쓰기 : 예를 들어

public static int count(String str, char a) 

을 : count("Welcome", 'e') 반환 2. 사용자에게 문자가 따라 오는 문자열을 입력하고 문자열에있는 문자의 발생 횟수를 표시하도록하는 테스트 프로그램을 작성하십시오. 내 코드와

문제 : 스레드에서

예외 "주요"java.lang.StringIndexOutOfBoundsException : 문자열 색인이 범위를 벗어 : -1

내 코드 :

import java.util.Scanner; 
public class Exercise18_10{ 
    public static void main(String[] args){ 
     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter a string"); 
     String str = input.next(); 
     System.out.println("Please enter a character"); 
     char car = input.next().charAt(0); 
     int x = count ("welcome", 'e'); 
     System.out.println("The number of character " +car + " in string " +str + "  = "+ x); 
    }//main 

    public static int count(String str, char a){ 
     int ct = 0;  
     if(str.length()>0) 
      if(str.charAt(0) == a) 
       ct ++; 
     count(str.substring(1),a); 
     return ct; 
    } 
} 

제발 도와주세요, 내가 뭘 잘못하고있어?

+1

코드를 형식화하는 법을 배우십시오. – nhouser9

+0

한 가지 문제는'ct'에 추가하는 대신'count'에 대한 재귀 호출의 결과를 버리고 있다는 것입니다. –

+1

분기 나 루프의 경우'{'와'} '문자를 사용하여 항상 ** ** 항상 **의 습관을 습득하는 것이 좋습니다. '{'와'} '문자를 여기 코드의 적절한 위치에 넣으면, 문제가 무엇인지 즉시 알 수있을 것입니다. –

답변

0

인덱스가 범위를 벗어났습니다. count(str.substring(1),a); 문자열이 한 문자 만 있고 문자열이없는 문자열을 얻으려고하면 해당 문자가 없음을 알 수 있습니다.

추신 : 당신이 것을 해결 한 후, 당신은 또한 오류에 대해서 ...

+0

고마워요 – qad

0

당신이 추가하고 CT 변수의 값을 유지하는 방법을 확인해야합니다, 무엇을 할 때 지속적으로 substring(1)을 어떻게됩니까? 결국 부분 문자열을 사용할 수없는 빈 문자열이 생깁니다. if str.length() > 0substring 호출을 방해하지 않습니다.

또 다른 문제 - ct 변수는 메서드에 로컬로 적용되므로 메서드를 호출 할 때마다 0으로 다시 설정됩니다.

당신

ct 정적 변수를 만들 수 있지만, 방법 나는이 문제를 접근하는 것 - ct 변수 매개 변수를 유지하기 위해 다른 방법을 구현합니다. 다른 하나

public static int count(String str, char a) { 
    return countHelper(str, a, 0); 
} 
+0

고맙습니다. – qad

+0

답변을 수락하면 감사의 말을 전할 수 있습니다. http://stackoverflow.com/help/someone-answers –

0

private static int countHelper(String str, char a, int count){ 
    if (str == null || str.length() <= 0) return count; // End recursion 

    if(str.charAt(0) == a) 
     count++; // Increment count 

    // No need for an else statement, recurse with substring 
    return countHelper(str.substring(1), a, count); 
} 

그런 다음, 실제 방법은 단지 대표 당신은 if{...}count(str.substring(1), a)를 작성해야합니다. 코드의 다른 주요 문제는 count을 rescurve에서 보존 할 수 없다는 것이므로 count을 정적으로 만들거나 아래 코드를 변경해야합니다.

public static int count(String str, char a) { 
    int ct = 0; 
    if (str.length() > 0) { 
     if (str.charAt(0) == a) 
      ct++; 
     ct += count(str.substring(1), a); 
    } 
    return ct; 
} 
+0

도움을 주셔서 감사합니다 – qad

1

다른 답변은 정확합니다. str.substring(1)을 호출하기 전에 문자열의 길이를 확인해야합니다. 그러나 ct 변수를 유지 관리하는 다른 방법은 필요하지 않습니다.재귀 함수와

import java.util.Scanner; 

public class Exercise18_10 { 

    public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("Please enter a word: "); 
    String word = input.next(); 
    System.out.print("Please enter a character: "); 
    char c = input.next().charAt(0); 
    int count = count(word, c); 
    System.out.println(String.format("%d occurrences of %c in '%s'", count, c, word)); 
    } 

    public static int count(String str, char a) { 
    if (str.length() == 0) { 
     return 0; 
    } 
    int count = 0; 
    if (str.charAt(0) == a) { 
     count++; 
    } 
    return count + count(str.substring(1), a); 
    } 


} 
+0

고마워요 – qad

+0

오신 것을 환영합니다. 체크 표시를 클릭하여 대답을 승인 된 것으로 표시 할 수 있습니다. StackOverflow에 오신 것을 환영합니다. 그리고 반원들과 함께 행운을 빈다. –

0
public static int count(String str, char a) { 
    int ct = 0;  
    if (str.length() > 0) { 
     if (str.charAt(0) == a) { 
      ct++; 
     } 
     return ct + count(str.substring(1), a); 
    } 
    return ct; 
} 

항상 종료 조건을 파악하고 기본 값 (해당되는 경우)와, 거기에서 기능을 종료, 다음은 자바 (101) 적절한 대답이다. 이 경우 문자열의 길이가 0이면 카운트 0으로 반환하십시오. 다른 경우 (문자열 길이가 0보다 큰 경우)에서 함수를 다시 호출하십시오.

또한 함수의 첫 번째 호출에서 계수의 최종 합계를 얻으려면 함수와 계수의 값을 합계로 반환해야합니다.

+0

대단히 감사합니다. – qad

관련 문제