Подсчитайте заглавные буквы в строке - PullRequest
2 голосов
/ 23 марта 2019

Я пытаюсь создать простую программу, которая подсчитывает символы верхнего регистра в String, перебирая каждый символ и увеличивая переменную-накопитель, если символ является заглавным.Вот мой код:

String str = "JuSTin"; //3 uppercase characters
int upperCaseCount = 0; //increment each time an uppercase character is encountered
char character; //the current character
for(int i = 0; i < str.length(); i++)
{
  character = str.charAt(i);
  System.out.println(character); //Log all characters to console just to see what is going on
  if(Character.isUpperCase(character))
      upperCaseCount++; 
  i++;  
}
System.out.println("Uppercase characters: " + upperCaseCount);

Когда запускается этот код выводит:

J
S
i
Uppercase characters: 2

Что вызывает этот вывод?Где 'u' 'T' и 'n' в "JuSTin"?Почему upperCaseCount равно 2, а не 3?

Ответы [ 4 ]

4 голосов
/ 23 марта 2019

В качестве дополнительной информации (для вашей учебной цели) вы можете решить ее различными способами, используя:

  • лямбда,
  • 'classic' for loop,
  • конструкция цикла, представленная в Java 7,
  • , регулярное выражение,
  • или цикл forEach

Каждый из этих способов имеет свои преимущества или недостатки.

С лямбдой

public static long countUpperCase(final String str) {
        return str
                .chars() // get all chars from the argument
                .filter(c -> Character.isUpperCase(c)) // filter only the uppercase
                .count(); // count the uppercase
    }

С классическим для петли

public static long countUpperCase(final String str) {
    long counter = 0;

    for(int i=0; i<str.length(); i++) {
        if(Character.isUpperCase(str.charAt(i))) {
            counter++;
        }
    }
    return counter;
}

С новой конструкцией петли(Java 7 или выше)

public static long countUpperCase(final String str) {
    long counter = 0;

    for(final char c: str.toCharArray()) {
        if(Character.isUpperCase(c)) {
            counter++;
        }
    }
    return counter;
}

В других сообщениях уже есть некоторые объяснения, например, Прописная запись SO

С регулярным выражением

public static long countUpperCase(final String str) {
    // \p{L} matches a single code point in the category "letter"
    // \p{L} matches all letters that are uppercase
    return str.split("(?=\\p{Lu})").length;
}

Если вам интересно покопаться немного глубже, взгляните на этот интересный PDF: Руководство по регулярному выражению

Сцикл forEach

public static long countUpperCase(final String str) {
    // the 'var' keyword can be used with Java 10 or higher
    final var counter = new AtomicInteger(0);

    // convert a string into a List<Character>
    // Note that this is only applicable since Java 8 or higher
    var chars = str
            .chars()
            .mapToObj(c -> (char) c)
            .collect(Collectors.toList());

    // count the number of uppercase letters
    chars.forEach(c -> {
        if(Character.isUpperCase(c)) {
            counter.incrementAndGet();
        }
    });

    return counter.get();
}
2 голосов
/ 23 марта 2019

Удалить второе i++.Это должно работать.

1 голос
/ 23 марта 2019

Почему вы увеличиваете i ++ внутри условия if.Значение i будет автоматически увеличиваться при использовании цикла for.

0 голосов
/ 23 марта 2019

В for loop for(int i = 0; i < str.length(); i++) вы уже увеличиваете значение i с помощью i++, но вы снова поместили i++ в цикл for. Так что значение i будет увеличенодважды.Вот почему вы получаете неправильный вывод.Просто удалите оператор i++ после оператора if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...