Подсчет гласных, метод повторения

    public static void main(String args[])
     {
        Scanner sc = new Scanner(System.in);
        int countVowel=0;
        int countVowelA=0;
        int countVowelE=0;
        int countVowelI=0;
        int countVowelO=0;
        int countVowelU=0;
        char ch;
        String str;
        System.out.println("Please enter the string : ");
        str = sc.nextLine();
        for(int i = 0; i<=str.length(); i ++)
        {
            ch = str.charAt(i);
            if(ch == 'a' || ch =='A')
            {
                countVowelA++;                 
                countVowel++;
            }
            if(ch == 'e' || ch =='E')
            {
                countVowelE++;
                countVowel++;
            }
            if(ch == 'i' || ch =='I')
            {
                countVowelI++;
                countVowel++;
            }
            if(ch == 'o' || ch =='O')
            {
                countVowelO++;
                countVowel++;
            }
            if(ch == 'u' || ch =='U')
            {
                countVowelU++;
                countVowel++;
            }
            i++;
        }
        System.out.println("Occurances of A in given string  : " +countVowelA);
        System.out.println("Occurances of E in given string  : " +countVowelE);
        System.out.println("Occurances of I in given string  : " +countVowelI);
        System.out.println("Occurances of O in given string  : " +countVowelO);
        System.out.println("Occurances of U in given string  : " +countVowelU);
        System.out.println("Number of vowels in strings are  : " +countVowel);
    }
}

Что касается меня, у меня проблемы, скажем, например, если я напишу, что Леброн Джеймс лучший баскетболист, ты это знаешь. Это дает мне ошибку, а также не считает все гласные? Кроме того, можете ли вы сказать, правильный ли мой код


person Community    schedule 22.10.2014    source источник
comment
Вы уверены в том, что i++; в конце цикла for?   -  person Thomas Jungblut    schedule 23.10.2014
comment
Способ определить, является ли ваш код правильным, — это протестировать его на всех видах входных данных и убедиться, что он не выдает ошибок и каждый раз дает правильный ответ. Если это не так, то это неправильно. Но помимо этого вам нужно показать нам, какую ошибку вы получаете, в том числе на какую строку она жалуется. И было бы полезно, если бы вы пометили свой входной пример (дело Леброна Джеймса) как что-то, что отличает его, например, полужирный шрифт, код, курсив, поместите его в кавычки и т. д.   -  person RealSkeptic    schedule 23.10.2014
comment
@Bally это означает: используйте отладчик. Ты сделал это? В этом коде есть две ошибки, которые очень легко обнаружить с помощью отладчика.   -  person Thomas Jungblut    schedule 23.10.2014
comment
возможный дубликат Используйте строковые методы для поиска и подсчета гласные в строке?   -  person StackFlowed    schedule 23.10.2014


Ответы (3)


проверьте строку ниже

 for(int i = 0; i<=str.length(); i ++)

изменить на

 for(int i = 0; i<str.length(); i ++)

Почему?

Потому что в Java индекс начинается с нуля. Когда у вас есть i <= str.length, он выходит за рамки индекса строки и дает вам java.lang.StringIndexOutOfBoundsException

Еще одна проблема. Вы увеличили переменную i дважды. Второе после того, как предложения if совершенно не нужны, потому что они дают вам неправильный ответ, даже если вы исправите проблему с границей.

person Kick Buttowski    schedule 22.10.2014
comment
Почти префект? это пойдет во все, если вы должны попросить его изменить это на другое, если ... - person StackFlowed; 23.10.2014
comment
@wrongAnswer спасибо за ваш вклад. Я думал об этом, но я думаю, что это не имеет большого значения :) - person Kick Buttowski; 23.10.2014
comment
@KickButtowski также использует отдельный счетчик для подсчета всего, что кажется излишним. ! - person StackFlowed; 23.10.2014
comment
@KickButtowski попробуйте запустить этот цикл 1000 раз как есть и 1000 раз с else if ... вы увидите разницу. AFAIK проверьте эту stackoverflow.com/a/26491980/1085186 первую часть, как еще, если работает... - person StackFlowed; 23.10.2014
comment
@wrongAnswer, если это так, лучшим решением является оператор Switch. - person Kick Buttowski; 23.10.2014
comment
@ У тебя все еще есть проблема? - person Kick Buttowski; 23.10.2014
comment
@KickButtowski, вы можете просто выполнить countVowelA+countVowelE+... добавить все, чтобы получить общее количество, вам не нужна другая переменная! - person StackFlowed; 23.10.2014
comment
Давайте продолжим обсуждение в чате. - person Kick Buttowski; 23.10.2014

Ваша переменная цикла i, как упоминалось в комментариях, увеличивается дважды. Один раз в самом операторе for, а другой в конце цикла.

Это означает, что счетчик идет: 0,2,4,6 вместо 0,1,2,3.

Это даст вам неправильный ответ.

Однако причина ошибки не в этом, а в том, что вы проверяете условие до i <= str.length(), а не до i < str.length(). Символы в строке, скажем, из 3 символов, таких как «the», равны 0,1,2. Нет символа номер 3. Поэтому, когда i равно str.length, вы получаете ошибку.

person RealSkeptic    schedule 22.10.2014

Попробуйте этот код

import java.util.Scanner;
public class CountVowels {

    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int countVowel=0;
        int countVowelA=0;
        int countVowelE=0;
        int countVowelI=0;
        int countVowelO=0;
        int countVowelU=0;
        char ch;
        String str;
        System.out.println("Please enter the string : ");
        str = sc.nextLine();
        char[] c = str.toCharArray();
        for(int i = 0; i<c.length; i ++)
        {
            if(c[i] == 'a' || c[i] =='A')
            {
                countVowelA++;                 
                countVowel++;
            }
            else if(c[i] == 'e' || c[i] =='E')
            {
                countVowelE++;
                countVowel++;
            }
            else if(c[i] == 'i' || c[i] =='I')
            {
                countVowelI++;
                countVowel++;
            }
            else if(c[i] == 'o' || c[i] =='O')
            {
                countVowelO++;
                countVowel++;
            }
            else if(c[i] == 'u' || c[i] =='U')
            {
                countVowelU++;
                countVowel++;
            }
            //i++;
        }
        System.out.println("Occurances of A in given string  : " +countVowelA);
        System.out.println("Occurances of E in given string  : " +countVowelE);
        System.out.println("Occurances of I in given string  : " +countVowelI);
        System.out.println("Occurances of O in given string  : " +countVowelO);
        System.out.println("Occurances of U in given string  : " +countVowelU);
        System.out.println("Number of vowels in strings are  : " +countVowel);
    }
}
person JHDev    schedule 22.10.2014
comment
Сброс кода приводит к тому, что ваш пост будет помечен как ответ низкого качества. пожалуйста, дайте некоторые пояснения. - person Kick Buttowski; 23.10.2014
comment
@Bable str.toCharArray(); преобразуйте вашу строку в массив символов, чтобы вы могли перебирать ее, чтобы найти любые гласные - person JHDev; 23.10.2014
comment
@ Kick Buttowski: вопрос ясен, и я пытаюсь дать Бэбли код, который он может выполнить, поэтому я просто вношу некоторые изменения в его код. - person JHDev; 23.10.2014
comment
@ Kick Buttowski : Я этого не делал. Я получил -1 в своем посте. - person JHDev; 23.10.2014