Есть ли способ проверить, содержит ли строка хотя бы одну заглавную букву рекурсивно с java? - PullRequest
0 голосов
/ 21 февраля 2020

Я получаю IndexOutOfBoundsException исключения, вероятно, из-за метода charAt, но я застрял. Я знаю, что должен использовать isUpperCase, но я не уверен, где именно.

public static boolean hasCapitals(String s) {
    if(Character.isUpperCase(s.charAt(0))) {
        return true;
    } else {
        return hasCapitals(s.substring(1));
    }
}

public static void main( String[] args ){
    System.out.println( hasCapitals( "New Hampshire" ) ); // returns true
    System.out.println( hasCapitals( "word" ) ); // returns false
    System.out.println( hasCapitals( "I" ) ); // returns true
    System.out.println( hasCapitals( "" ) ); // returns false
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

У вас должно быть критическое состояние в рекурсии, чтобы наконец выйти. Это условие отсутствует в вашем коде, и вы получаете исключение, когда длина вашей строки равна 1.

Попробуйте проверить длину строки перед вызовом isUpperCase.

public static boolean hasCapitals(String s) {
    if(s == null || s.length() == 0) {
        return false;
    }
    if(Character.isUpperCase(s.charAt(0))) {
        return true;
    } else if(s.length() > 1){
        return hasCapitals(s.substring(1));
    } else {
        return false;
    }
}
0 голосов
/ 21 февраля 2020

попробуй так, делает именно то, что тебе нужно

public static void main(String[] args) {
    System.out.println( hasCapitals( "New Hampshire", 0 ) );
    System.out.println( hasCapitals( "word", 0 ) );
    System.out.println( hasCapitals( "I", 0 ) );
    System.out.println( hasCapitals( "", 0 ) );
    System.out.println( hasCapitals( "hamPshire", 0 ) );
}

private static boolean hasCapitals(String value, int index) {
    if(value.isEmpty()) {
        return false;
    }

    if(Character.isUpperCase(value.charAt(index))) {
        return true;
    } else if(value.length() > (index + 1)) {
        return hasCapitals(value, index + 1);
    } 

    return false;

}
...