Поиск всех заглавных букв строки в java

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

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 4
at java.lang.String.charAt(String.java:686)
at P43.main(P43.java:13)

Я чувствую себя глупо, но я просто не могу этого понять, и оракул даже говорит о charAt на странице о java.lang.StringIndexOutOfBoundsException

Вот мой код для поиска заглавных букв и их печати:

import java.io.*;
import java.util.*;

public class P43{
   public static void main(String[] args){
      Scanner in = new Scanner(System.in);
      //Uppercase
      String isUp = "";
      System.out.print("Please give a string: ");
      String x = in.next();
      int z = x.length();
      for(int y = 0; y <= z; y++){
         if(Character.isUpperCase(x.charAt(y))){
            char w = x.charAt(y);
            isUp = isUp + w + " ";
         }
      }
      System.out.println("The uppercase characters are " + isUp);
      //Uppercase
   }
}

Я был бы очень признателен за любой вклад или помощь.


person EvanD    schedule 31.10.2012    source источник
comment
Просто упомянем, дайте осмысленные имена вашим именам переменных/классов/методов, а не называйте их x, y, z и w   -  person Can't Tell    schedule 31.10.2012
comment
Определенно. Обратите внимание, что в своем ответе я использовал такие идентификаторы, как inputString. используйте i, j, k для индексов со встроенными циклами, и вы можете использовать c для символа, но все остальное дает ему правильное имя.   -  person azz    schedule 31.10.2012
comment
Должно быть for(int y = 0; y ‹ z; y++) ..   -  person Igal Karlinsky    schedule 12.02.2020


Ответы (9)


for(int y = 0; y <= z; y++){

должно быть

for(int y = 0; y < z; y++){

Помните, что индекс массива начинается с НУЛЯ.

Длина строки возвращает

количество 16-битных символов Unicode в строке

Поскольку цикл начинается с НУЛЯ, цикл должен заканчиваться на длине 1.

person kosa    schedule 31.10.2012
comment
Спасибо, чувак, я чувствую себя действительно глупо, ха-ха. Ошибка начинающих. - person EvanD; 31.10.2012

Индекс массива выходит за границы из-за того, что цикл for не заканчивается на length - 1, он завершается на length. Большинство итераций для циклов должно быть в форме:

for (int i = 0; i < array.length; i++) {
    // access array[i];
}

То же самое и со строкой.

Возможно, более чистым способом было бы:

String inputString; // get user input

String outputString = "";

for (int i = 0; i < inputString.length; i++) {
    c = inputString.charAt(i);
    outputString += Character.isUpperCase(c) ? c + " " : ""; 
}
System.out.println(outputString);

Изменить: забыл String Не реализует Iterable<Character>, глупая Java.

person azz    schedule 31.10.2012

С Java 8 вы также можете использовать лямбда-выражения. Преобразуйте String в IntStream, используйте фильтр, чтобы получить только символы верхнего регистра, и создайте новый String, добавив отфильтрованные символы к StringBuilder:

Scanner in = new Scanner(System.in);
System.out.print("Please give a string: ");
//Uppercase
String isUp = in.next()
        .chars()
        .filter(Character::isUpperCase)
        .collect(StringBuilder::new, // supplier
                StringBuilder::appendCodePoint, // accumulator
                StringBuilder::append) // combiner
        .toString();
System.out.println("The uppercase characters are " + isUp);
//Uppercase

Вдохновлен:

person ltlBeBoy    schedule 04.01.2017

Попробуй это...

Метод:

public int findUpperChar(String valitateStr) {
    for (int i = valitateStr.length() - 1; i >= 0; i--) {
        if (Character.isUpperCase(valitateStr.charAt(i))) {
            return i;
        }
    }
    return -1;
}

Использование:

String passwordStr = password.getText().toString();

 .......

int len = findUpperChar(passwordStr);

if ( len != -1) {

      capitals exist.   

  } else {

      no capitals exist.            
}
person Silambarasan Poonguti    schedule 08.10.2014

Привет, один из простых шагов, чтобы найти символ в верхнем регистре в заданной строке...

Программа

import java.io.*;
public class testUpper 
{
    public static void main(String args[]) throws IOException
    {
        String data,answer="";
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter any String : ");
        data=br.readLine();
        char[] findupper=data.toCharArray();
        for(int i=0;i<findupper.length;i++)
        {
            if(findupper[i]>=65&&findupper[i]<=91) //ascii value in between 65 and 91 is A to Z
            {
                answer+=findupper[i]; //adding only uppercase
            }
        }
        System.out.println("Answer : "+answer);
    }
}

Вывод

Введите любую строку:

Добро пожаловать в мир струн

Ответ: WTHSWRD.

person Praveenkumar_V    schedule 31.10.2012

Здесь вы можете повысить читабельность своего кода и воспользоваться некоторыми другими функциями современной Java. Пожалуйста, используйте подход Stream для решения этой проблемы. Кроме того, я предлагаю импортировать в свой класс наименьшее количество библиотек. Пожалуйста, избегайте использования .* при импорте.

import java.util.Scanner;

public class P43 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Please give a string: ");
        String x = in.next();
        x.chars().filter(c -> Character.isUpperCase(c))
                .forEach(c -> System.out.print((char) c + " "));
    }
}

Пример ввода:

сохранить изменения в редакторе

Пример вывода:

C I T E

person Mohammad    schedule 14.09.2018

Самый простой способ, который я знаю, - использовать замену регулярных выражений.

isUp = x.replaceAll("[^A-Z]", "");

Проще говоря, здесь используется регулярное выражение, которое соответствует любому символу, не входящему в диапазон от A до Z, и заменяет его пустой строкой.

person Andrew Ring    schedule 11.02.2020

person    schedule
comment
Хм, там 50442 буквенных символа, 1155 из которых прописные. ASCII не актуален. charAt возвращает единицу кода UTF-16. UTF-16 — это кодировка набора символов Unicode. - person Tom Blodget; 08.02.2017

person    schedule
comment
Вывод = Получить ученика по имени - person Rajitha Bhanuka; 04.10.2018
comment
В этом ответе нет объяснений, почему он полезен. Этот код был бы намного полезнее, если бы он также объяснял, как этот код отвечает на вопрос пользователей. - person help-info.de; 04.10.2018